2015-11-11 5 views
-1

я пытаюсь работать с XML с несколькими свойствами ведьма выглядит такПреобразование XML с помощью XSL

<AllNames name="John"> 
    <dates> 
     <date day="20150126" country="uk" fruit="kiwi">PP</rank> 
     <date day="20150227" country="uk" fruit="coconut">PP</rank> 
    </dates> 
    </AllNames> 
    <AllNames name="Michael"> 
     <dates> 
     <date day="20150126" country="uk" fruit="apple">XX</rank> 
     <date day="20150127" country="uk" fruit="orange">YY</rank> 
    </dates> 
    </AllNames> 

я хочу, чтобы мой результат выглядеть так:

Джон, 20150126, Великобритания, киви, PP

Джон, 20150227, Великобритания, кокос, PP

Майкл, 20150126, Великобритания, яблоко, XX

Майкл, 20150127, Великобритания, оранжевый, YY

я попробовал этот код, который dosnt работу на всех, пожалуйста, помогите мне

<?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" /> 
<xsl:variable name="delimiter" select="','" /> 
<xsl:variable name="fieldArray"> 
    <field>name</field> 
    <field>day</field> 
    <field>country</field> 
    <field>fruit</field> 
    </xsl:variable> 
    <xsl:param name="fields" select="document('')/*/xsl:variable[@name='fieldArray']/*" /> 

    <xsl:template match="/"> 
     <xsl:for-each select="$fields"> 
     <xsl:if test="position() != 1"> 
     <xsl:value-of select="$delimiter"/> 
     </xsl:if> 
     <xsl:value-of select="." /> 
    </xsl:for-each> 
<xsl:text> 
</xsl:text> 
    <xsl:apply-templates select="AllNames/name"/> 
    </xsl:template> 

    <xsl:template match="rank"> 
    <xsl:variable name="currNode" select="." /> 

    <xsl:for-each select="$fields"> 
     <xsl:if test="position() != 1"> 
     <xsl:value-of select="$delimiter"/> 
     </xsl:if> 
     <xsl:value-of select="$currNode/*[name() = current()]" /> 
    </xsl:for-each> 
     <xsl:text> 
</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+4

Можете ли вы опубликовать хорошо сформированный образец XML для начала? Я боюсь ' PP' не является корректным. –

+1

У вас не может быть двух корневых элементов. –

ответ

2

Ваш вход по-прежнему не очень хорошо сформированный XML. Если у вас вход, такие как:

XML

<root> 
    <entry name="John"> 
     <dates> 
     <date day="20150126" country="uk" fruit="kiwi">AA</date> 
     <date day="20150227" country="uk" fruit="coconut">BB</date> 
     </dates> 
    </entry> 
    <entry name="Michael"> 
     <dates> 
     <date day="20150126" country="uk" fruit="apple">XX</date> 
     <date day="20150127" country="uk" fruit="orange">YY</date> 
     </dates> 
    </entry> 
</root> 

вы можете использовать:

XSLT 1,0

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

<xsl:template match="/root"> 
    <xsl:for-each select="entry/dates/date"> 
     <xsl:value-of select="../../@name" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="@day" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="@country" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="@fruit" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="." /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

получить:

John,20150126,uk,kiwi,AA 
John,20150227,uk,coconut,BB 
Michael,20150126,uk,apple,XX 
Michael,20150127,uk,orange,YY 
+1

У меня есть тест на exmaple в Internet explorer , и результаты не так, как ожидалось, это то, что я получил: AA BB XX YY – 2Big2BeSmall

+2

@Francy. Вы можете видеть, как это работает с моим кодом здесь: http://xsltransform.net/bFN1y96 Если вы получаете разные результаты, ваш код должен быть другим. –

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