1

我有这个 xslt

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:data="urn:X-data"
                exclude-result-prefixes="xsd data"
                version="2.0">

<data:convert>
  <convert old="RequestedLoans" new="RequestedLoan"/>
  <convert old="Companies" new="Company"/>
  ...add more here...
</data:convert>

<xsl:key name="converts" match="convert" use="@old"/>

<xsl:template match="*[key('converts',name(.),document(''))]">
  <xsl:element name="{key('converts',name(.),document(''))/@new}"
               namespace="{namespace-uri()}">
    <xsl:apply-templates select="@*,node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*|node()"><!--identity for all other nodes-->
  <xsl:copy>
    <xsl:apply-templates select="@*,node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

我需要在我的应用程序中使用它,但由于它是 XSLT 2.0,我不能使用它。我想知道这是否可以转换为 XSLT 1.0。我对XSLT一无所知,请帮助我。

4

1 回答 1

4

快速浏览一下,唯一的 XSLT 2.0 构造是在“@*, node()”中使用了两次的逗号运算符,在这种情况下可以安全地替换为联合运算符“|”。

当然,将 XSLT 2.0 转换为 XSLT 1.0 的一般任务在理论上是可能的(两种语言都是图灵完备的,因此等效),但在实践中却极其困难。这种情况下的转换之所以有效,是因为我们知道“@*, node()”总是按文档顺序传递一个序列。

另一个需要注意的是,尽管这种转换很容易,但我发现修改用一种你不知道的语言编写的代码的想法非常可怕。当您不了解燃气锅炉的工作原理时,这有点像试图修理您的燃气锅炉。当你尝试它时,我不想在房子里。

于 2013-09-19T08:27:53.280 回答