2013-11-27 3 views
1

Я имею следующую упрощенную структуру XML:XSLT 1.0: группировка одного значения во многие значения - использование ключей?

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<DESADV> 
<M_DESADV> 
    <G_SG10> 
     <G_SG13> 
      <S_GIN> 
       <id>GIN</id> 
       <D_7405_6>BJ</D_7405_6> 
       <C_C208_2> 
        <D_7402_8>373500699550026556</D_7402_8> 
       </C_C208_2> 
      </S_GIN> 
     </G_SG13> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>110005</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>123456</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG13> 
      <S_GIN> 
       <id>GIN</id> 
       <D_7405_6>BJ</D_7405_6> 
       <C_C208_2> 
        <D_7402_8>3735009999999999</D_7402_8> 
       </C_C208_2> 
      </S_GIN> 
     </G_SG13> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>632154</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>887796</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
</M_DESADV> 
</DESADV> 

мне нужно сделать отображение таким образом я получаю следующий вывод XML:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<number>373500699550026556 110005</number> 
<number>373500699550026556 123456</number> 
<number>3735009999999999 632154</number> 
<number>3735009999999999 887796</number> 
</list> 

меня возникли проблемы при получении, что выход хотя. У меня есть следующие XSLT, что я хотя бы работать:

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

<xsl:template match="text()"/> 

<xsl:template match="/"> 
    <list> 
    <xsl:apply-templates/> 
    </list> 
</xsl:template> 

<xsl:template match="M_DESADV"> 

    <xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2"> 
     <number> 
      <xsl:value-of select="concat(
       parent::C_C212_2/parent::S_PIA/parent::G_SG17/parent::G_SG10/parent::M_DESADV 
       /G_SG10/G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ', 
       .) 
       "/> 
     </number> 
    </xsl:for-each> 
</xsl:template> 



</xsl:stylesheet> 

Но мой результат выглядит следующим образом, который не то, что я ожидал:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<number>373500699550026556 110005</number> 
<number>373500699550026556 123456</number> 
<number>373500699550026556 632154</number> 
<number>373500699550026556 887796</number> 
</list> 

Может ли это быть решена с Muenchian группирование? Я попытался настроить ключ, но он либо выбирает «D_7402_8», либо только «D_7140_2».

Может ли кто-нибудь показать мне, как я могу это решить? Спасибо и наилучшими пожеланиями, Peter

ответ

1

Я не думаю, что вам нужно ключи для этого вам просто нужно найти для каждого G_SG10 -Вот-есть-а-G_SG17, его ближайшего предшествующего двойников G_SG10 -that- имеет-a- G_SG13:

<xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2"> 
    <number> 
     <xsl:value-of select="concat(
      ancestor::G_SG10/preceding-sibling::G_SG10[G_SG13][1] 
      /G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ', 
      .) 
      "/> 
    </number> 
</xsl:for-each> 

Если условие в реальной XML является более сложным, чем «имеет G_SG13», то вам просто нужно кодировать соответствующее условие в первом предиката на preceding-sibling:: стадии, например,

preceding-sibling::G_SG10[G_SG13/S_GIN/D_7405_6='BJ'][1] 
+0

Здравствуйте, Ян, спасибо. Это работает хорошо. Я никогда раньше не работал с «предком ::». Используя это, я могу избежать всех «родителей ::» - это правильно? Еще раз спасибо, Peter – Peter

+0

Привет, Ян, у меня на самом деле был SG_11 между ними, поэтому я изменил путь к «ancestor :: G_SG10/previous-sibling :: G_SG10 [G_SG11/G_SG13] [1]» работает отлично! :-) +1 – Peter

+0

@Peter да, ось предка смотрит на вашего родителя, прародителя и т. Д. В этом порядке (меньшие числа означают «ближе» предков). Существует также 'ancestor-or-self ::', если вы хотите начать поиск с '.' перед проверкой' ..'. –

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