简体   繁体   English

XSLT 1.0 排序帮助

[英]XSLT 1.0 Help in Sorting

I have a requirement where i need to do sorting and grouping.我有一个要求,我需要进行排序和分组。 I have worked my XSLT with sorting but its not giving me the desired output ,我已经使用 XSLT 进行排序,但它没有给我想要的输出,

Input XML :输入 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>

Desired OutPut :期望输出:

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

Issue :问题 :

So the XSLT is grouping and Copying but the xml is not validating with xsd as Detail hierarchy is wrong.It Should Be ItemName,Quantity,Rate.所以 XSLT 正在分组和复制,但 xml 没有使用 xsd 进行验证,因为详细信息层次结构是错误的。它应该是 ItemName、Quantity、Rate。

Appreciate the help感谢帮助

Try it this way:试试这个方法:

XSLT 1.0 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM