Xml 基于属性值的XSLT 2.0组相邻

Xml 基于属性值的XSLT 2.0组相邻,xml,xslt-2.0,Xml,Xslt 2.0,我试图使用XSLT生成XML,我想在两个连续节点的属性值为Position=“a”时生成一个字符串,我想在字符串中添加一个连字符(-),否则我想连接节点值。我尝试使用属性值相邻的组,但在空属性节点上失败。我尝试为属性值添加string(),但没有成功 <xsl:variable name="columnId"> <xsl:for-each-group select="CabinLayout/Columns" group-adjacen

我试图使用XSLT生成XML,我想在两个连续节点的属性值为Position=“a”时生成一个字符串,我想在字符串中添加一个连字符(-),否则我想连接节点值。我尝试使用属性值相邻的组,但在空属性节点上失败。我尝试为属性值添加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>

A.
B
C
D
E
F
输出-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>

A.
B
C
D
E
F
G
H
J
K
输出: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>

A.
B
C
D
E
F
G
H
J
K

输出:ABC-DEFG-HJK

我认为以下以结尾的
组解决了这个问题:

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

我将使用
当前分组-键()
,如果它是
A
,则使用值分隔符
-
,否则将使用空字符串作为分隔符获取值:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wd="urn:com.test/bsvc" exclude-result-prefixes="wd">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    
    <xsl:template match="/"> 
        <xsl:variable name="columnId">
            <xsl:for-each-group select="CabinLayout/Columns" group-adjacent="string(@Position)">
                <xsl:choose>
                    <xsl:when test="current-grouping-key()='A'">
                        <xsl:value-of select="current-group()" separator="-"/>
                    </xsl:when>
                    <xsl:otherwise><xsl:value-of select="current-group()" separator=""/></xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:variable>
        <ColumnID><xsl:value-of select="$columnId"/></ColumnID>
    </xsl:template>
    
</xsl:stylesheet>

类似这样的内容:

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:strip-space elements="*"/>  

  <xsl:template match="/">
    <ColumnID>
      <xsl:for-each-group select="CabinLayout/Columns" group-adjacent="string(@Position)">
        <xsl:choose>
          <xsl:when test="current-group()[@Position]">
            <xsl:value-of select="current-group()" separator="-"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="current-group()" separator=""/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
    </ColumnID>
      
  </xsl:template>
</xsl:stylesheet>


以下所有解决方案都运行良好,将逐一进行,并尝试多种方案。谢谢。效果很好,谢谢。效果很好,将尝试多种方案。谢谢。谢谢你的回答,它对给定的输入有效,将交叉检查多个场景。