XSLT, добавление предыдущих данных к следующей итерации для каждого - PullRequest
4 голосов
/ 05 июля 2011

Мне нужно конкретное решение для моего XSLT, и я изо всех сил пытаюсь понять, как заставить его работать.Прямо сейчас мой XML структурирован так:

<DataX>
   <DataY>
       <fieldy>A</fieldy>
       <fieldx>B</fieldx>
       <Data1>
           <field1>1</field1>
           <field2>2</field2>
       </Data1>
       <Data2>
           <field3>3</field3>
           <field4>4</field4>
       </Data2>
       <Data3>
           <field5>5</field5>
           <field6>6</field6>
       </Data3>
   </DataY>
</DataX>

Что мне нужно сделать, это добавить содержимое <DataY> <field1> <field2> к каждому экземпляру внутренних полей данных.Не изменяя исходный XML

Вот так

A B 1 2    A B 3 4    A B 5 6

Вот так, я добавил пробелы для ясности.

Я пробовал некоторые внутренние операторы for-each и несколько другихвещи.У меня нет опыта работы с XSLT, но, может быть, я слишком много думаю об этом.Я просто не уверен, как получить данные AB после того, как был сделан проход, используя for-each.Какие-нибудь мысли?

Ответы [ 2 ]

5 голосов
/ 05 июля 2011

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

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

 <xsl:variable name="vPrefix">
  <xsl:for-each select="/*/DataY/*[not(starts-with(name(),'Data'))]">
    <xsl:value-of select="."/>
  </xsl:for-each>
 </xsl:variable>

 <xsl:template match="/*/*/*[starts-with(name(),'Data')]">
  <xsl:value-of select="concat($vPrefix, .)"/>
 </xsl:template>

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

при применении к предоставленному документу XML :

<DataX>
    <DataY>
        <fieldy>A</fieldy>
        <fieldx>B</fieldx>
        <Data1>
            <field1>1</field1>
            <field2>2</field2>
        </Data1>
        <Data2>
            <field3>3</field3>
            <field4>4</field4>
        </Data2>
        <Data3>
            <field5>5</field5>
            <field6>6</field6>
        </Data3>
    </DataY>
</DataX>

дает требуемый, правильный результат (без пробелов, поскольку они были добавлены в вопросе "для ясности"):

AB12AB34AB56
2 голосов
/ 05 июля 2011

Вы должны начать с этим преобразованием.


<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="/*/*">
        <xsl:apply-templates select="*[2]/following-sibling::*" mode="data"/>
    </xsl:template>

    <xsl:template match="*" mode="data">
        <xsl:value-of select="concat(../*[1],../*[2],*[1],*[2])"/>
    </xsl:template>

</xsl:stylesheet>

При применении к этому входу:

<DataX>
   <DataY>
       <fieldx>A</fieldx>
       <fieldy>B</fieldy>
       <Data1>
           <field1>1</field1>
           <field2>2</field2>
       </Data1>
       <Data2>
           <field3>3</field3>
           <field4>4</field4>
       </Data2>
       <Data3>
           <field5>5</field5>
           <field6>6</field6>
       </Data3>
   </DataY>
</DataX>

производит:

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