XSL все записи из XML

#xml #xslt

#xml #xslt

Вопрос:

у меня есть, например, этот исходный XML:

 <People>
   <Person Name="NameOne"/>
   <Person Name="NameTwo"/>
</People>
  

У меня есть этот XSL:

 <?xml version="1.0" encoding="Windows-1250"?>
<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:template match="/">
     <xsl:for-each select="People">  
        <Names> 
                <Human><xsl:value-of select="Person/@Name"/></Human>
        </Names>
     </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>
  

У меня есть этот вывод XML:

 <Names> 
     <Human>NameOne</Human>
</Names>
  

Но мне нужен этот вывод со всеми записями:

 <Names> 
     <Human>NameOne</Human>
     <Human>NameTwo</Human>
</Names>
  

У вас есть какие-нибудь идеи, пожалуйста?

Комментарии:

1. 1 за хороший документированный вопрос

Ответ №1:

Проблема в том, что вы перебираете элементы People

 <xsl:for-each select="People">  
  

Но у вас есть только один элемент People в вашем XML. Вам нужно «сопоставить» элемент People, затем выполнить итерацию по элементам Person

Попробуйте этот XSLT

 <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:template match="People">
    <Names> 
        <xsl:for-each select="Person">  
            <Human><xsl:value-of select="@Name"/></Human>
        </xsl:for-each> 
    </Names>
</xsl:template>
</xsl:stylesheet>
  

Или, что еще лучше, используйте полностью шаблонный подход без xsl: для каждого

 <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:template match="People">
    <Names> 
        <xsl:apply-templates select="Person" /> 
    </Names>
</xsl:template>

<xsl:template match="Person">
    <Human><xsl:value-of select="@Name"/></Human>
</xsl:template>
</xsl:stylesheet>
  

Ответ №2:

Пожалуйста, используйте приведенный ниже код, если вы хотите использовать for-each

 <xsl:template match="/">
    <Names> 
    <xsl:for-each select="People/Person">            
            <Human><xsl:value-of select="@Name"/></Human>
    </xsl:for-each> 
    </Names>
</xsl:template>