#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>