这不是一个真正的问题,而是我想分享的令人惊讶的xslt2体验。
获取片段(从另一个组中减去一组)
<xsl:variable name="v" as="node()*">
<e a="a"/>
<e a="b"/>
<e a="c"/>
<e a="d"/>
</xsl:variable>
<xsl:message select="$v/@a[not(.=('b','c'))]"/>
<ee>
<xsl:sequence select="$v/@a[not(.=('b','c'))]"/>
</ee>
我应该得到什么? 我希望在控制台上一个
<ee>a d</ee>
在输出处。
我得到的是
<?attribute name="a" value="a"?><?attribute name="a" value="d"?>
在控制台和
<ee a="d"/>
在输出。我应该知道将$ v / @ a作为属性节点序列来预测输出。
为了获得我想要的东西,我必须将属性序列转换为字符串序列,如:
<xsl:variable name="w" select="$v/@a[not(.=('b','c'))]" as="xs:string*"/>
问题:
有没有使用属性序列(或者它只是节点集概念的有趣效果)?
如果是这样,我是否可以静态输入属性序列,就像我能够输入字符串序列:(&#39; a&#39 ;,&#39; b&#39;&#39; C&#39;&#39; d&#39)
是否有任何内联语法将属性序列转换为字符串序列? (为了达到省略变量 w 的相同结果)
这似乎是使用 xsl:sequence 创建属性的一种优雅方式。或者这是否滥用xslt2,标准未涵盖?
答案 0 :(得分:0)
至于“是否有任何内联语法将属性序列转换为字符串序列”,您只需添加步骤<logger name="org.springframework.jndi" level="INFO" />
即可。或者使用$v/@a[not(.=('b','c'))]/string()
,当然也可以使用XPath 3 for $a in $v/@a[not(.=('b','c'))] return string($a)
。
我不确定关于“使用属性序列”的问题是什么,特别是因为它提到了节点集的XPath 1概念。如果要编写函数或模板以从输入返回一些原始属性节点,则$v/@a[not(.=('b','c'))]!string()
允许这样做。当然,在像元素内容这样的序列构造函数中,如果你在https://www.w3.org/TR/xslt20/#constructing-complex-content中查看10),最后会创建一个属性的副本。
至于创建一系列属性,你不能在无法创建新节点的XPath中这样做,你可以在XSLT中这样做:
xsl:sequence
然后您可以在其他地方使用它,如
<xsl:variable name="att-sequence" as="attribute()*">
<xsl:attribute name="a" select="1"/>
<xsl:attribute name="b" select="2"/>
<xsl:attribute name="c" select="3"/>
</xsl:variable>
并将获得
<xsl:template match="/*">
<xsl:copy>
<element>
<xsl:sequence select="$att-sequence"/>
</element>
<element>
<xsl:value-of select="$att-sequence"/>
</element>
</xsl:copy>
</xsl:template>
http://xsltfiddle.liberty-development.net/jyyiVhg
XQuery具有更紧凑的语法,而XPath允许表达式创建新节点:
<example>
<element a="1" b="2" c="3"/>
<element>1 2 3</element>
</example>