2013-11-28 113 views
0

你好,我正试图测试我的当前节点是否与另一个节点匹配。这是我的xml:xslt测试/匹配当前节点与另一个节点

<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> 

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

|~|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> 

非常感谢您的帮助。

回答

0

我不知道你在想什么.=child::B475应该实现的,但我认为你这样事情就简单公平一点,只有

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

更换整个的

<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> 

如果有一个ctry根据B475匹配当前的那么这将打印date紧接着它(如果碰巧有多个匹配ctry那么你会得到t他在之前date第一个一匹配)。如果没有这样的ctry它不会打印任何东西。您不需要choose,因为value-of会自动为您提供空字符串,如果其select表达式未找到任何节点(value-of空节点集定义为空字符串)。

+0

非常感谢伊恩!它完美的工作! – user2406147

相关问题