XSLT вложенный для цикла - PullRequest
       8

XSLT вложенный для цикла

0 голосов
/ 01 декабря 2018

Я новичок в XSLT и столкнулся с типичной проблемой.Ниже подробно описана проблема.Мне нужен результат из ItemB (столько раз, сколько ItemB), где атрибут BNum id сопоставляется с идентификатором ANum, а на выходе будет конкатенация атрибута VAR1 id и ANum id.

Зацикливание объектов - главная проблема, с которой я сталкиваюсь.

Пример ввода:

<?xml version="1.0" encoding="UTF-8"?>
<myData>
<ItemA>
   <VAR1 id="1234">
     <ANum id = "3333"/>
     <ANum id = "5555"/>
     <ANum id = "6666"/>
   </VAR1>
   <VAR1 id="7B62">
     <ANum id = "4444"/>
   </VAR1>
</ItemA>
<ItemB>
   <BNum id = "6666"/>
</ItemB>
<ItemB>
   <BNum id = "4444"/>
</ItemB>
</myData>

Желаемый вывод:

 <?xml version="1.0" encoding="UTF-8"?>
    <result>
     <ItemC>
       <CNum id = "1234-6666"/>
      </ItemC>
     <ItemC>
       <CNum id = "7B62-4444"/>
     </ItemC>
    </result>

Я пытался скод ниже -

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <result>
            <xsl:for-each select="myData/ItemB">
                <ItemC>
                    <CNum>
                        <xsl:value-of select="BNum"/>
                        <xsl:if test="../ItemA/VAR1/ANum/@id = BNum/@id">
                            <xsl:attribute name="id">
                                <xsl:value-of select="concat(../ItemA/VAR1/@id,'-',BNum/@id)"/>
                            </xsl:attribute>
                        </xsl:if>
                    </CNum>
                </ItemC>
            </xsl:for-each>
        </result>
    </xsl:template>
</xsl:stylesheet>

И я получаю вывод как -

<?xml version="1.0" encoding="UTF-8"?>
<result>
 <ItemC>
   <CNum id = "1234-6666"/>
  </ItemC>
 <ItemC>
   <CNum id = "1234-4444"/>
 </ItemC>
</result>

Последнее значение ItemC неверно и нуждается в помощи в его исправлении.

1 Ответ

0 голосов
/ 01 декабря 2018

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

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="v1" match="VAR1" use="ANum/@id" />

<xsl:template match="/myData">
    <result>
        <xsl:for-each select="ItemB/BNum">
            <ItemC>
                <CNum id="{key('v1', @id)/@id}-{@id}"/>
            </ItemC>
        </xsl:for-each>
    </result>
</xsl:template>

</xsl:stylesheet>

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

...