我试图向下查看 XML 文档中的一个级别,选择不同的值并为每个不同的值填充新元素。例如。获取输入 xml
<Invoice>
<InvoiceNumber>99-99</InvoiceNumber>
<Customer>ACME</Customer>
<Lines>
<Line>
<LineNumber> 1 </LineNumber>
<Color> Blue </Color>
</Line>
<Line>
<LineNumber> 1 </LineNumber>
<Color> Blue </Color>
</Line>
<Line>
<LineNumber> 1 </LineNumber>
<Color> Red </Color>
</Line>
<Line>
<LineNumber> 1 </LineNumber>
<Color> Yellow</Color>
</Line>
</Lines>
</Invoice>
示例 XSLT
<xsl:for-each select="/Invoice/Lines/Line/Color[not(.=preceding-sibling::Line/Color)]">
<Colors >
<ID><xsl:value-of select="/Color"/></ID>
</Colors>
</xsl:for-each>
所需输出
<Colors>
<ID>Blue</ID>
</Colors>
<Colors>
<ID>Red</ID>
</Colors>
<Colors>
<ID>Yellow</ID>
</Colors>
但是,我似乎只能输出这个
<Colors>
<ID>Blue Red Yellow</ID>
</Colors>
我做错了什么?
这个样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/Invoice">
<xsl:for-each select="distinct-values(Lines/Line/Color)">
<Colors>
<ID>
<xsl:value-of select="."/>
</ID>
</Colors>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
应用于示例输入时,将返回:
<?xml version="1.0" encoding="UTF-8"?>
<Colors>
<ID> Blue </ID>
</Colors>
<Colors>
<ID> Red </ID>
</Colors>
<Colors>
<ID> Yellow</ID>
</Colors>
这样做可能会更好:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/Invoice">
<root>
<xsl:for-each select="distinct-values(Lines/Line/Color)">
<Colors>
<ID>
<xsl:value-of select="normalize-space(.)"/>
</ID>
</Colors>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
获得格式正确的 XML 文档并删除多余的空格:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Colors>
<ID>Blue</ID>
</Colors>
<Colors>
<ID>Red</ID>
</Colors>
<Colors>
<ID>Yellow</ID>
</Colors>
</root>