我花了很多时间用谷歌搜索,但没有找到答案或解决方案。在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在这方面表现不同。
答案 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>