从不同的子节点 XSLT 填充递归元素

问题描述 投票:0回答:1

我试图向下查看 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>

我做错了什么?

xslt xslt-2.0
1个回答
0
投票

这个样式表:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.