【问题标题】:XSLT 1.0 Help in SortingXSLT 1.0 排序帮助
【发布时间】:2020-01-28 15:40:28
【问题描述】:

我有一个需要进行排序和分组的要求。我已经在我的 XSLT 上进行了排序,但它没有给我想要的输出,

输入 XML:

<ns0:Root xmlns:ns0="http://TestXSLT1._0.Output">
  <SeqNo>1</SeqNo>
  <FileName>Test</FileName>
  <DestinationLocation>Miami</DestinationLocation>
  <DestinationName>State</DestinationName>
  <Detail>
    <ItemName>Item1</ItemName>
    <Rate>100</Rate>
  </Detail>
  <Detail>
    <ItemName>Item2</ItemName>
    <Rate>200</Rate>
  </Detail>
  <Detail>
    <ItemName>Item3</ItemName>
    <Rate>300</Rate>
  </Detail>
  <Detail>
    <ItemName>Item1</ItemName>
    <Quantity>1</Quantity>
  </Detail>
  <Detail>
    <ItemName>Item2</ItemName>
    <Quantity>2</Quantity>
  </Detail>
</ns0:Root>

期望的输出:

<ns0:Root xmlns:ns0="http://TestXSLT1._0.Output">
        <SeqNo>1</SeqNo>
        <FileName>Test</FileName>
        <DestinationLocation>Miami</DestinationLocation>
        <DestinationName>State</DestinationName>
        <Detail>
            <ItemName>Item1</ItemName>
            <Quantity>1</Quantity>
            <Rate>100</Rate>
        </Detail>
        <Detail>
            <ItemName>Item2</ItemName>
            <Quantity>2</Quantity>
            <Rate>200</Rate>
        </Detail>
        <Detail>
            <ItemName>Item3</ItemName>
            <Rate>3</Rate>
        </Detail>
    </ns0:Root>

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" omit-xml-declaration="yes"/>

  <xsl:key name="detail-by-item" match="Detail" use="ItemName"/>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:copy-of select="*[not(self::Detail)]"/>
      <xsl:for-each select="Detail[generate-id()=generate-id(key('detail-by-item', ItemName))]">
        <xsl:copy>
          <xsl:copy-of select="ItemName"/>
          <xsl:copy-of select="key('detail-by-item', ItemName)/*[not(self::ItemName)]"/>
        </xsl:copy>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

问题:

所以 XSLT 正在分组和复制,但是 xml 没有使用 xsd 验证,因为详细信息层次结构是错误的。它应该是 ItemName、Quantity、Rate。

感谢帮助

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    试试这个方法:

    XSLT 1.0

    <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" omit-xml-declaration="yes"/>
    
    <xsl:key name="detail-by-item" match="Detail" use="ItemName"/>
    
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:copy-of select="*[not(self::Detail)]"/>
            <xsl:for-each select="Detail[generate-id()=generate-id(key('detail-by-item', ItemName))]">
                <xsl:copy>
                    <xsl:copy-of select="ItemName"/>
                    <xsl:variable name="grp" select="key('detail-by-item', ItemName)" />
                    <xsl:copy-of select="$grp/Quantity"/>
                    <xsl:copy-of select="$grp/Rate"/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多