XSLT 2 - 来自全局参数的nodeset

时间:2013-05-27 14:32:58

标签: xslt-2.0 node-set nodesets

我花了很多时间用谷歌搜索,但没有找到答案或解决方案。在XSLT 2中,有可能将变量转换为节点集。所以像这样的工作。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="var" as="element()">
  <element><subelement>A</subelement><subelement>B</subelement></element>
</xsl:variable>

<xsl:template match="/">
  <xsl:copy-of select="$var/subelement[1]" />-->
</xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<subelement>A</subelement>

但是当我尝试这个时

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="par" />

<xsl:template match="/">
      <xsl:copy-of select="$par/subelement[1]" />
</xsl:template>

</xsl:stylesheet>

并将值<element><subelement>A</subelement><subelement>B</subelement></element>作为参数“par”传递给XSLT处理器(Saxon,Altova),然后我收到错误:

Error in XPath 2.0 expression
Type error XPTY0004: Expected a node - current item is '<element><subelement>A</subelement><subelement>B</subelement></element>' of type xs:string

好吧,我可以没有那个,但我只是想知道为什么xsl:variable和xsl:param在这方面表现不同。

1 个答案:

答案 0 :(得分:0)

您如何使用这些处理器?我认为从命令行可以提供的是XPath表达式或原始值,但不是节点或节点序列。但是使用API​​ http://www.saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.s9api/XsltTransformer@setParameter,您应该能够传递一系列节点。作为替代方法,如果要传入带有标记的字符串以便解析为节点,则在字符串值上使用扩展函数saxon:parse-xml或XSLT 3.0函数http://www.w3.org/TR/xpath-functions-30/#func-parse-xml(仅在商业版本中支持)萨克森,我认为)。

AltovaXML http://manual.altova.com/AltovaXML/altovaxmlcommunity/index.html?axjavaxslt2.htm似乎限制传入一个解释为XPath表达式的字符串;由于XPath无法构造新节点,因此无法直接传递节点,因为AltovaXML似乎不支持使用XML标记解析带有XML标记的字符串的扩展函数,我认为使用Altova,您确实比使用Saxon更受限制。< / p>