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

Inf*_*nd' 1 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>
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

这是所需的输出,我试图生成:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ney 5

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

<xsl:template match="text()[. = 'test value']">
    <xsl:text>replaced</xsl:text>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

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