我需要获取优先级元素的数据。我有一个条件,如果它不为空,需要首先得到<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
谢谢。
答案 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