基于属性值的 XSLT 2.0 group-adjacent
XSLT 2.0 group-adjacent based on attribute value
我正在尝试使用 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
我认为以下 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>
我会使用 current-grouping-key()
,如果它是 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>
我正在尝试使用 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
我认为以下 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>
我会使用 current-grouping-key()
,如果它是 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>