XSLT 1.0 有助于排序
XSLT 1.0 Help in Sorting
我有一个要求,我需要在其中进行排序和分组。我已经对 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 进行验证,因为详细层次结构是 wrong.It 应该是 ItemName、Quantity、Rate。
感谢帮助
这样试试:
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>
我有一个要求,我需要在其中进行排序和分组。我已经对 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 进行验证,因为详细层次结构是 wrong.It 应该是 ItemName、Quantity、Rate。
感谢帮助
这样试试:
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>