使用XSLT连接所有数据

时间:2017-03-24 00:16:16

标签: xml xslt xslt-2.0

我需要获取优先级元素的数据。我有一个条件,如果它不为空,需要首先得到<AAA>。否则,我将从<BBB>获取数据。 <ParentElem>的父元素<BBB>可以多次出现,因此,例如,我有3 <ParentElem>,我需要连接<BBB>的所有值。下面是我的XML文件,其中<AAA>元素为NULL。在这种情况下,我将从<BBB>元素中获取值。

INPUT

<RootElem>
    <DataRec>
        <Struc>
            <AAA></AAA>
        </Struc>
        <ParentElem>
            <Docu>
                <BBB>11111</BBB>
            </Docu>
        </ParentElem>
        <ParentElem>
            <Docu>
                <BBB>22222</BBB>
            </Docu>
        </ParentElem>
        <ParentElem>
            <Docu>
                <BBB>33333</BBB>
            </Docu>
        </ParentElem>
    </DataRec>
</RootElem>

预期输出

<ID>111112222233333</ID>

XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="not(normalize-space(/RootElem/DataRec/Struc/AAA)='')">
            <ID>
                <xsl:value-of select="/RootElem/DataRec/Struc/AAA"/>
            </ID>
        </xsl:when>
        <xsl:when test="not(normalize-space(/RootElem/DataRec/ParentElem/Docu/BBB)='')">
            <xsl:for-each select="/RootElem/DataRec/ParentElem">
                <ID>
                    <xsl:value-of select="concat(./Docu/BBB)"/>
                </ID>
            </xsl:for-each>
        </xsl:when>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

我不知道如何对<BBB>的每次出现进行连接。是否可以在XSLT中执行此操作?我正在使用XSLT 2.0

谢谢。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案可能是

<ID>
  <xsl:value-of select="(.//AAA/text(), string-join(.//BBB, ''))[1]"/>
</ID>

答案 1 :(得分:0)

我大多在猜这里,但试试:

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

<xsl:template match="/RootElem">
    <xsl:choose>
        <xsl:when test="DataRec/Struc/AAA[normalize-space()]">
            <ID>
                <xsl:apply-templates select="DataRec/Struc/AAA"/>
            </ID>
        </xsl:when>
        <xsl:when test="DataRec/ParentElem/Docu/BBB[normalize-space()]">
            <ID>
                <xsl:apply-templates select="DataRec/ParentElem/Docu/BBB"/>
            </ID>
        </xsl:when>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

工作演示:
(a)http://xsltransform.net/94AbWCc
(b)http://xsltransform.net/94AbWCc/1