我花了很多时间在谷歌上,但没有找到答案或解决方案。在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>
传递给XSLT处理器(Saxon, Altova)作为参数"par",然后我得到错误:
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在这里的行为不同
如何使用这些处理器?我认为从命令行中所能提供的只是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(我认为只有在Saxon的商业版本中才支持)。
似乎与AltovaXML http://manual.altova.com/AltovaXML/altovaxmlcommunity/index.html?axjavaxslt2.htm你被限制在一个字符串解释为XPath表达式;因为XPath不能构造新节点,所以不能直接传递节点,而且AltovaXML似乎不支持将带有XML标记的字符串解析为节点的扩展函数,所以我认为使用Altova确实比Saxon更受限制。