XSL: Как объединить узлы с условиями? - PullRequest
1 голос
/ 04 августа 2011

У меня есть следующий код (например):

<response>
  <parameter>
    <cottage>
      <cot>
       <res>
        <hab desc="Lakeside">
          <reg cod="OB" prr="600.84>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#</lwz>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120830#20120831#EU#3-0#</lwz>
            <lwz>TR#2#AB#200.26#0#QB#OK#20120831#20120901#EU#3-0#</lwz>

Мне нужно создать каскадную строку, которая включает всю первую строку 'lwz' и затем цену (200,26, но она может быть разной в каждой строке) для каждой соответствующей строки.

Таким образом, вывод, отделяя каждую строку с | будет:

TR # 2 # # AB 200,26 # 0 # QB ​​# OK # 20120829 # 20120830 # EU # 3-0 # | 200,26 | 200,26

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Это преобразование XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="lwz[1]">
     <xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="lwz[position() >1]">
     <xsl:value-of select=
     "concat('&#xA;',
              substring-before(substring-after(substring-after(substring-after(.,'#'),'#'),'#'),'#')
          )
     "/>
 </xsl:template>

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

при применении к предоставленному тексту (преобразованный в правильно сформированный XML-документ !!!):

<response>
    <parameter>
        <cottage>
            <cot>
                <res>
                    <hab desc="Lakeside">
                        <reg cod="OB" prr="600.84">
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#</lwz>
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120830#20120831#EU#3-0#</lwz>
                            <lwz>TR#2#AB#200.26#0#QB#OK#20120831#20120901#EU#3-0#</lwz>
                        </reg>
                    </hab>
                </res>
            </cot>
        </cottage>
    </parameter>
</response>

дает желаемый, правильный результат :

TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#
200.26
200.26

II решение XSLT 2.0 :

Это преобразование:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="lwz[1]">
     <xsl:value-of select="."/>
 </xsl:template>

 <xsl:template match="lwz[position() >1]">
     <xsl:value-of select=
     "concat('&#xA;', tokenize(.,'#')[4])"/>
 </xsl:template>

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

при применении к вышеуказанному XML-документу снова дает желаемый, правильный результат. Обратите внимание на использование стандартной функции XPath 2.0 tokenize():

TR#2#AB#200.26#0#QB#OK#20120829#20120830#EU#3-0#
200.26
200.26
0 голосов
/ 04 августа 2011

Вы можете использовать функцию XPath substring для выбора подстрок из данных вашего узла lwz. На самом деле вы не будете подробно рассказывать о своей проблеме, если вы хотите получить более подробный ответ, возможно, предоставите полный XML-документ и свой лучший вариант XSLT

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...