首页 > 解决方案 > 基于属性值的 XSLT 2.0 group-adjacent

问题描述

我正在尝试使用 XSLT 生成 XML,我想在两个连续节点的属性值为 Position="A" 时生成一个字符串,我想在字符串中添加一个连字符(-),否则我想连接节点值. 我尝试将 group-adjacent 与属性值一起使用,但它在空属性节点上失败。我尝试为属性值添加 string(),但没有奏效。

<xsl:variable name="columnId">
  <xsl:for-each-group select="CabinLayout/Columns" group-adjacent="string(@Position)">
    <xsl:value-of select="current-group()"/>
  </xsl:for-each-group>
</xsl:variable>
<ColumnID><xsl:value-of select="translate($columnId,' ','-')"/></ColumnID>

以下是示例输入和所需输出

<CabinLayout>
  <Columns Position="W">A</Columns>
  <Columns>B</Columns>
  <Columns Position="A">C</Columns>
  <Columns Position="A">D</Columns>
  <Columns>E</Columns>
  <Columns Position="W">F</Columns>
</CabinLayout>

输出 - ABC-DEF

<CabinLayout>
  <Columns Position="W">A</Columns>
  <Columns>B</Columns>
  <Columns>C</Columns>
  <Columns Position="A">D</Columns>
  <Columns>E</Columns>
  <Columns>F</Columns>
  <Columns>G</Columns>
  <Columns>H</Columns>
  <Columns>J</Columns>
  <Columns Position="W">K</Columns>
</CabinLayout>

输出:ABCDEFGHJK

<CabinLayout>
  <Columns Position="W">A</Columns>
  <Columns>B</Columns>
  <Columns Position="A">C</Columns>
  <Columns Position="A">D</Columns>
  <Columns>E</Columns>
  <Columns>F</Columns>
  <Columns Position="A">G</Columns>
  <Columns Position="A">H</Columns>
  <Columns>J</Columns>
  <Columns Position="W">K</Columns> 
</CabinLayout>

输出:ABC-DEFG-HJK

标签: xmlxslt-2.0

解决方案


我认为以下group-ending-with解决了这个问题:

  <xsl:template match="CabinLayout">
    <ColumnID>
      <xsl:value-of separator="-">
        <xsl:for-each-group select="Columns" group-ending-with="Columns[@Position = 'A' and following-sibling::Columns[1][@Position = 'A']]">
          <xsl:sequence select="string-join(current-group(), '')"/>
        </xsl:for-each-group>        
      </xsl:value-of>
    </ColumnID>
  </xsl:template>

推荐阅读