【问题标题】:Processing XML inside XML text node with XSLT使用 XSLT 处理 XML 文本节点内的 XML
【发布时间】:2011-12-06 23:37:28
【问题描述】:

我有一个带有文本节点的 XML,它也是一个 XML。我需要用 XSLT 2.0 转换这个 XML(外部 XML)并更改 inner XML(文本节点中的那个)中的一些东西。结果 XML 应具有与输入 XML 相同的结构(包括带有 XML 的文本节点),但更改应用于内部 XML。

我使用的是 Saxon XSLT 处理器,所以我可以访问 parse() 函数。但我不确定如何使用它来处理内部 XML,然后将其 back 转换为文本节点。

这是一个示例输入 XML:

<tag>
    <innerXml>
         &lt;node1&gt;
           &lt;node2&gt;Value&lt;/node2&gt;
         &lt;/node1&gt;
    </innerXml>
</tag>

XSLT 转换会输出:

<tag>
    <innerXml>
         &lt;node1&gt;
           &lt;node2&gt;Some other value&lt;/node2&gt;
         &lt;/node1&gt;
    </innerXml>
</tag>

请注意,内部 XML 比这复杂得多,因此简单的字符串替换将不起作用。

【问题讨论】:

    标签: xml parsing text xslt saxon


    【解决方案1】:

    嗯,你应该能够做到(你有xmlns:saxon="http://saxon.sf.net/"

    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:saxon="http://saxon.sf.net/"
      xmlns:my="http://example.com/my"
      exclude-result-prefixes="saxon my"
    
      version="2.0">
    
    <xsl:output name="my:ser" method="xml" omit-xml-declaration="yes"/>
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* , node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="innerXml">
      <xsl:variable name="temp">
        <xsl:apply-templates select="saxon:parse(.)/node1"/>
      </xsl:variable>
      <xsl:copy>
       <xsl:value-of select="saxon:serialize($temp, 'my:ser')"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="node2[. = 'Value']">
      <xsl:copy>
        <xsl:text>Some other value</xsl:text>
      </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    使用 Saxon 9.1 进行测试。对于 Saxon 9.3 的商业版本,您可以选择使用 version="3.0" 作为样式表,这样可以使用默认函数命名空间中的内置解析和序列化函数,而不是使用我上面使用的 Saxon 扩展函数。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多