我有一个XML,其中一个值为“null tag”的文本节点(随机)出现在文件的不同位置。
我的问题是如何用其他文本替换文本,其中元素(和父节点)名称未知。我已经创建了一个看起来有点笨重的XSLT文件,我不确定它在转换时间内的效率。
这是我创建的示例测试XML:
<root>
<sub_root>abc</sub_root>
<sub_root>
<child>test value</child>
<child2>test value</child2>
<sub_child>
<node1>data</node1>
<node2>data2</node2>
<node3>
<grand_child>test value</grand_child>
</node3>
<node4>test value</node4>
</sub_child>
</sub_root>
</root>
这是XSLT:
<xsl:template match="@*|*|text()">
<xsl:copy>
<xsl:choose>
<xsl:when test="text()='test value'">
<xsl:apply-templates select="@*|*"/>
<xsl:text>replaced</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|*|text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
这是所需的输出,我正在尝试生成:
<root>
<sub_root>abc</sub_root>
<sub_root>
<child>replaced</child>
<child2>replaced</child2>
<sub_child>
<node1>data</node1>
<node2>data2</node2>
<node3>
<grand_child>replaced</grand_child>
</node3>
<node4>replaced</node4>
</sub_child>
</sub_root>
</root>
可以用更好的方式(以任何方式)编写此代码吗?或者我的代码是否足够好?
答案 0 :(得分:5)
只需将其添加到身份转换中:
<xsl:template match="text()[. = 'test value']">
<xsl:text>replaced</xsl:text>
</xsl:template>
结果会将输入中未修改的每个节点复制到输出 - 除了值为test value
的文本节点,它将转换为值为replaced
的文本节点。