xslt测试/匹配当前节点与另一个节点

时间:2013-11-28 17:33:42

标签: xml xslt

您好我正在尝试测试我的当前节点是否与另一个节点匹配。这是我的xml:

<top-level>
<ep-bulletin>
    <SDOBI>
        <B200>
            <B210>R1</B210>
        </B200>
        <B400>
            <B472>
                <B475>
                    <date>20030221</date>
                    <ctry>GB</ctry>
                    <date>20030222</date>
                    <ctry>LU</ctry>
                </B475>
            </B472>
        </B400>
        <B800>
            <B840>
                <ctry>DE</ctry>
                <ctry>FR</ctry>
                <ctry>GB</ctry>
                <ctry>IT</ctry>
                <ctry>LU</ctry>
                <ctry>SE</ctry>
            </B840>
        </B800>
    </SDOBI>
</ep-bulletin>
<ep-bulletin>
    <SDOBI>
        <B200>
            <B210>R2</B210>
        </B200>
        <B400>
            <B472>
                <B475>
                    <date>20040609</date>
                    <ctry>AT</ctry>
                    <date>20110630</date>
                    <ctry>BE</ctry>
                    <date>20110630</date>
                    <ctry>CH</ctry>
                    <date>20120103</date>
                    <ctry>DE</ctry>
                    <date>20110630</date>
                    <ctry>DK</ctry>
                    <date>20110630</date>
                    <ctry>FR</ctry>
                    <date>20110612</date>
                    <ctry>GB</ctry>
                    <date>20110612</date>
                    <ctry>IT</ctry>
                    <date>20110630</date>
                    <ctry>LI</ctry>
                    <date>20120101</date>
                    <ctry>NL</ctry>
                    <date>20110613</date>
                    <ctry>SE</ctry>
                </B475> 
            </B472>
        </B400>
        <B800>
            <B840>                          

                <ctry>AT</ctry>
                <ctry>BE</ctry>
                <ctry>CH</ctry>
                <ctry>DE</ctry>
                <ctry>DK</ctry>
                <ctry>ES</ctry>
                <ctry>FR</ctry>
                <ctry>GB</ctry>
                <ctry>IT</ctry>
                <ctry>LI</ctry>
                <ctry>NL</ctry>
                <ctry>SE</ctry>
            </B840>
        </B800>
    </SDOBI>
</ep-bulletin>
</top-level>

我希望能够检查B400 / B440 / ctry中是否包含B800 / B840 / ctry。我想要获得的输出是一个表,在第一列中包含一个记录id,在第二列中包含我当前节点,在第三列中包含匹配节点之前的节点B475 / date(|〜|是文本标识符;分隔符)。

|~|R1|~|;|~|DE|~|;|~||~|
|~|R1|~|;|~|FR|~|;|~||~|
|~|R1|~|;|~|GB|~|;|~|20030221|~|
|~|R1|~|;|~|IT|~|;|~||~|
|~|R1|~|;|~|LU|~|;|~|20030222|~|
|~|R1|~|;|~|SE|~|;|~||~|
|~|R2|~|;|~|AT|~|;|~|20040609|~|
|~|R2|~|;|~|BE|~|;|~|20110630|~|
|~|R2|~|;|~|CH|~|;|~|20110630|~|
|~|R2|~|;|~|DE|~|;|~|20120103|~|
|~|R2|~|;|~|DK|~|;|~|20110630|~|
|~|R2|~|;|~|ES|~|;|~||~|
|~|R2|~|;|~|FR|~|;|~|20110630|~|
|~|R2|~|;|~|GB|~|;|~|20110612|~|
|~|R2|~|;|~|IT|~|;|~|20110612|~|
|~|R2|~|;|~|LI|~|;|~|20110630|~|
|~|R2|~|;|~|NL|~|;|~|20120101|~|
|~|R2|~|;|~|SE|~|;|~|20110613|~|

这是我写的xslt代码,但我无法获取最后一列。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="/">

<xsl:text>&#13;&#10;</xsl:text>

<xsl:for-each select="top-level/ep-bulletin/SDOBI/B800/B840/ctry">

<xsl:text>|~|</xsl:text>

<xsl:value-of select="../../../B200/B210"/>

<xsl:text>|~|;|~|</xsl:text>

<xsl:value-of select="."/>

<xsl:text>|~|;|~|</xsl:text>

<xsl:choose>
<xsl:when test=".=child::B475">
<xsl:value-of select="../../../preceding::B475/ctry"/>
</xsl:when>
<xsl:otherwise >
<xsl:value-of select="">
</xsl:otherwise>
</xsl:choose>

<xsl:text>|~|</xsl:text>
<xsl:text>&#13;&#10;</xsl:text>

</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定你认为.=child::B475应该达到什么目标,但我认为你可以简化一些事情,取代整个

<xsl:choose>
<xsl:when test=".=child::B475">
<xsl:value-of select="../../../preceding::B475/ctry"/>
</xsl:when>
<xsl:otherwise >
<xsl:value-of select="">
</xsl:otherwise>
</xsl:choose>

只是

<xsl:value-of select="../../../B400/B472/B475
                      /ctry[. = current()]/preceding-sibling::date[1]" />

如果ctry下的B475与当前的date匹配,那么这将打印紧接其之前的ctry(如果恰好有多个匹配date ctry 1}}然后你会在匹配的第一个之前获得choose。如果没有这样的value-of,它将不打印任何内容。您不需要select,因为如果value-of表达式找不到任何节点,{{1}}将自动为您提供空字符串({{1}}空节点集是定义为空字符串)。