xml - 如何遍历任何 XML 并使用 XSLT 替换特定值
问题描述
我想创建一个循环遍历任何 XML 结构并替换特定值的 XSLT 转换。例如:
输入 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Node1>
<Node2>
<Node3>
<Tag1>1</Tag1>
<Tag2>2</Tag2>
<Tag3>3</Tag3>
</Node3>
</Node2>
</Node1>
假设我想用“1”替换任何值“2”
预期输出 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Node1>
<Node2>
<Node3>
<Tag1>1</Tag1>
<Tag2>1</Tag2>
<Tag3>3</Tag3>
</Node3>
</Node2>
</Node1>
我已经尝试使用 xsl:for-each 和 xsl:if 语句循环,但它不起作用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select=".">
<xsl:for-each select=".">
<xsl:if test="xsl:value-of select = '2'">
xsl:value-of select = '1'
</xsl:if>
</xsl:for-each>
</xsl:copy-of>
</xsl:template>
</xsl:stylesheet>
我假设 xsl:value-of 部分不正确,但我真的不知道如何访问条件中标签的值。
解决方案
这似乎是一个奇怪的要求。假设“值”表示元素中的文本节点(而不是属性的值),您可以简单地执行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[.='2']">
<xsl:text>1</xsl:text>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- c# - 如何使损害客户端团结一致?
- python - 使用漂亮的汤 python 从标签中提取 html ID
- javascript - 声明接口而不是类型
- vue.js - 将 v-bind 添加到属性时 v-dialog 的 v-btn 消失
- c# - 我们如何在 PDFLib set-graphics-option 中传递专色值列表?
- javascript - 使用 map() 从另一个数组元素值更改数组元素顺序
- node.js - 使用 npm 和 Zurb Foundation 安装 Swup 的问题
- python - 使用 Beautiful Soup 4 提取带有连字符的属性值
- ruby - 创建带索引的数组,并与其他数组进行比较
- mount - 如何在 Linux 中挂载非超级用户可以写入的驱动器