在谓词中使用分配给变量的当前分组键
Use current-grouping-key assigned to variable in a predicate
我在将现有的 xslt1.0 样式表转换为 2.0 时遇到问题。
我正在使用 Saxon 作为处理器。
问题出在这条指令上:
<xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code= $ERval]" group-by="refCde">
其中变量“ERval”是使用另一个 for-each-group 中的 current-grouping-key 函数设置的。
ERval 被设置为 xs:untypedAtomic,并且出现错误“'/' 的第一个操作数的必需项类型是节点 (),提供的值具有项类型 xs:untypeAtomic."
我尝试了不同的方法,但我遗漏了一些东西。
有人可以解释一下,如何实现它,并指出解释它的文档部分吗?
感谢您的帮助。
XML 输入
<?xml version="1.0" encoding="ISO-8859-1"?>
<art>
<MAPs>
<typeMAP>
<libArt>ANJOU TOLERIE</libArt>
<ERs>
<er>
<code>18</code>
</er>
<er>
<code>21</code>
</er>
</ERs>
<refCde>1234</refCde>
</typeMAP>
<typeMAP>
<libArt>ARTICLE HOTELIER</libArt>
</typeMAP>
<typeMAP>
<libArt>BOOK</libArt>
<ERs>
<er>
<code>18</code>
</er>
</ERs>
<refCde>5678</refCde>
</typeMAP>
<typeMAP>
<libArt>ARTICLE HOTELIER</libArt>
</typeMAP>
</MAPs>
</art>
样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template match="/">
<xsl:apply-templates select="//art"/>
</xsl:template>
<xsl:template match="art">
<xsl:if test="./MAPs/typeMAP/ERs/er/code">
<xsl:for-each-group select="./MAPs/typeMAP" group-by="ERs/er/code">
<!-- call template passing ERval-->
<xsl:call-template name="template">
<xsl:with-param name="currentArt" select="."/>
<xsl:with-param name="ERval" select="current-grouping-key()"/>
</xsl:call-template>
</xsl:for-each-group>
</xsl:if>
</xsl:template>
<xsl:template name="template">
<xsl:param name="currentArt" select="''"/>
<xsl:param name="ERval" select="()"/>
<xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">
<xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我想你想要 <xsl:for-each-group select="current-group()" group-by="refCde">
而不是 <xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">
。
我在将现有的 xslt1.0 样式表转换为 2.0 时遇到问题。
我正在使用 Saxon 作为处理器。
问题出在这条指令上:
<xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code= $ERval]" group-by="refCde">
其中变量“ERval”是使用另一个 for-each-group 中的 current-grouping-key 函数设置的。
ERval 被设置为 xs:untypedAtomic,并且出现错误“'/' 的第一个操作数的必需项类型是节点 (),提供的值具有项类型 xs:untypeAtomic."
我尝试了不同的方法,但我遗漏了一些东西。
有人可以解释一下,如何实现它,并指出解释它的文档部分吗?
感谢您的帮助。
XML 输入
<?xml version="1.0" encoding="ISO-8859-1"?>
<art>
<MAPs>
<typeMAP>
<libArt>ANJOU TOLERIE</libArt>
<ERs>
<er>
<code>18</code>
</er>
<er>
<code>21</code>
</er>
</ERs>
<refCde>1234</refCde>
</typeMAP>
<typeMAP>
<libArt>ARTICLE HOTELIER</libArt>
</typeMAP>
<typeMAP>
<libArt>BOOK</libArt>
<ERs>
<er>
<code>18</code>
</er>
</ERs>
<refCde>5678</refCde>
</typeMAP>
<typeMAP>
<libArt>ARTICLE HOTELIER</libArt>
</typeMAP>
</MAPs>
</art>
样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template match="/">
<xsl:apply-templates select="//art"/>
</xsl:template>
<xsl:template match="art">
<xsl:if test="./MAPs/typeMAP/ERs/er/code">
<xsl:for-each-group select="./MAPs/typeMAP" group-by="ERs/er/code">
<!-- call template passing ERval-->
<xsl:call-template name="template">
<xsl:with-param name="currentArt" select="."/>
<xsl:with-param name="ERval" select="current-grouping-key()"/>
</xsl:call-template>
</xsl:for-each-group>
</xsl:if>
</xsl:template>
<xsl:template name="template">
<xsl:param name="currentArt" select="''"/>
<xsl:param name="ERval" select="()"/>
<xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">
<xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我想你想要 <xsl:for-each-group select="current-group()" group-by="refCde">
而不是 <xsl:for-each-group select="$currentArt/MAPs/typeMAP[ERs/er/code = $ERval]" group-by="refCde">
。