0

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

4

1 回答 1

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字符串值(我认为仅在 Saxon 的商业版本中支持)。

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

于 2013-05-27T16:01:13.190 回答