xslt2:属性节点序列

时间:2017-12-29 20:11:33

标签: xslt-2.0

这不是一个真正的问题,而是我想分享的令人惊讶的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,标准未涵盖?

1 个答案:

答案 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>

http://xqueryfiddle.liberty-development.net/948Fn56