gpt4 book ai didi

xslt - 将 XSLT 转换应用于已转换的 XML

转载 作者:行者123 更新时间:2023-12-04 17:41:07 25 4
gpt4 key购买 nike

全部,

我有一个 XML 文件,我使用 XSLT 文档将其转换为另一个 XML。

我可以在同一个 XSLT 文件中定义另一组转换以应用于第一个转换的结果 XML 吗?

谢谢,

MK

最佳答案

是的。

一、这个XSLT 1.0转换 :

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="vrtfPass1">
<xsl:apply-templates/>
</xsl:variable>

<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="node()|@*" mode="pass2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="pass2"/>
</xsl:copy>
</xsl:template>

<xsl:template match="num/text()">
<xsl:value-of select="2*."/>
</xsl:template>

<xsl:template match="num/text()" mode="pass2">
<xsl:value-of select="1+."/>
</xsl:template>

<xsl:template match="/">
<xsl:apply-templates select="ext:node-set($vrtfPass1)/*" mode="pass2"/>
</xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时 :
<t>
<num>1</num>
<num>2</num>
<num>3</num>
<num>4</num>
<num>5</num>
</t>

生产 :
<t>
<num>3</num>
<num>5</num>
<num>7</num>
<num>9</num>
<num>11</num>
</t>

请注意 :
  • 实际执行了两次转换 ,第二个是在第一个的结果上执行的。
  • 第一次变换的结果是变量$vrtfPass1的内容.
  • 在 XSLT 1.0 中,包含动态生成的(临时)XML 树(XML 文档或 XML 片段)的变量类型是 RTF (结果树片段)。 RTF 上不可能有 XPath 操作——它需要使用扩展函数 xxx:node-set() 转换为常规节点集,由绝大多数 XSLT 1.0 处理器供应商提供。在这个例子中使用了 exslt:node-set(),因为 EXSLT 是由许多不同的供应商实现的。
  • 第二个转换应用于第一个 的结果:<xsl:apply-templates select="ext:node-set($vrtfPass1)/*" mode="pass2"/> .单独的 mode用于干净地分离两个转换的代码。
  • 第一个变换乘以每个 num/text()按 2。第二个转换每个 num/text() 递增.结果是2*.+1

  • 二、此 XSLT 2.0 转换 :
    <xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" >
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="vPass1">
    <xsl:apply-templates mode="pass1"/>
    </xsl:variable>

    <xsl:template match="node()|@*" mode="pass1">
    <xsl:copy>
    <xsl:apply-templates select="node()|@*" mode="pass1"/>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="node()|@*" mode="pass2">
    <xsl:copy>
    <xsl:apply-templates select="node()|@*" mode="pass2"/>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="num/text()" mode="pass1">
    <xsl:value-of select="2*xs:integer(.)"/>
    </xsl:template>

    <xsl:template match="num/text()" mode="pass2">
    <xsl:value-of select="1+."/>
    </xsl:template>

    <xsl:template match="/">
    <xsl:apply-templates select="$vPass1" mode="pass2"/>
    </xsl:template>
    </xsl:stylesheet>

    当应用于同一个 XML 文档时,产生相同的想要和正确的结果 .

    请注意 :在 XSLT 2.0/XPath 2.0 中,RTF 类型已被取消。否 xxx:node-set()需要扩展功能。

    关于xslt - 将 XSLT 转换应用于已转换的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678353/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com