2013-11-28 3 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: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]" /> 

Если есть a ctry под B475, который соответствует текущему, тогда это напечатает date, который поступает непосредственно перед ним (если существует более одного соответствия ctry, тогда вы получите t он date перед первый тот, который соответствует). Если такого ctry нет, он ничего не распечатает. Вам не нужен choose, потому что value-of даст вам пустую строку автоматически, если ее выражение select не найдет узлов (value-of пустым набором узлов считается пустая строка).

+0

Большое спасибо Яну! Он отлично работает! – user2406147

Смежные вопросы