使用XSLT用一些其他文本替换文本节点的高效代码?

时间:2010-01-27 06:35:22

标签: xslt

我有一个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>

可以用更好的方式(以任何方式)编写此代码吗?或者我的代码是否足够好?

1 个答案:

答案 0 :(得分:5)

只需将其添加到身份转换中:

<xsl:template match="text()[. = 'test value']">
    <xsl:text>replaced</xsl:text>
</xsl:template>

结果会将输入中未修改的每个节点复制到输出 - 除了值为test value的文本节点,它将转换为值为replaced的文本节点。