XSLT 2.0 基于属性值的组相邻

Uma*_*van 5 xml xslt-2.0

我正在尝试使用 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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

输出-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>
Run Code Online (Sandbox Code Playgroud)

输出: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>
Run Code Online (Sandbox Code Playgroud)

输出:ABC-DEFG-HJK

Mad*_*sen 3

我将使用current-grouping-key()and if it is Athen make the value seperator -,否则获取以空字符串作为分隔符的值:

<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>
Run Code Online (Sandbox Code Playgroud)