Xml 在xsl中对属性及其周围的其他元素进行排序
我被这个问题困扰了好几天了 我试图在对嵌套元素的属性排序时复制xml文件。我觉得我所拥有的应该有用Xml 在xsl中对属性及其周围的其他元素进行排序,xml,xslt,Xml,Xslt,我被这个问题困扰了好几天了 我试图在对嵌套元素的属性排序时复制xml文件。我觉得我所拥有的应该有用 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my"> <xsl:output method="xml" indent="yes" /> <
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my:my">
<xsl:output method="xml" indent="yes" />
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PrProduct">
<xsl:copy>
<xsl:apply-templates select="node()|@* " >
<xsl:sort select="@TEC" order="descending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这里是xml
<body>
<issueobject>
<page>
</page>
<prproduct TEC="TOR">
</prproduct>
<prproduct TEC="UVA">
<partPage>
</partPage>
</issueobject>
</body>
我认为问题在于,我正在排序的元素的两侧都有相同级别的元素,就像在玩游戏时一样,我可以对数据进行排序,但最终会丢失前后的数据
谢谢样式表所做的是按照(不存在的)
TEC
属性的值对PrProduct
元素的内容进行排序。您需要的是一个与PrProduct
的父级匹配的模板,在您的例子中是issueobject
,它可以对PrProduct
元素进行排序。大概是这样的:
<xsl:template match="issueobject">
<xsl:copy>
<xsl:apply-templates select="PrProduct[1]/preceding-sibling::*"/>
<xsl:apply-templates select="PrProduct">
<xsl:sort select="@TEC" order="descending"/>
</xsl:apply-templates>
<xsl:apply-templates select="PrProduct[1]/following-sibling::*[not(self::PrProduct)]"/>
</xsl:copy>
</xsl:template>
(请注意,此示例忽略
issueobject
的文本子级)您当前模板正在尝试对prproduct元素的子节点进行排序,并发现橱柜是空的。相反,您可以更改模板以仅匹配第一个prproduct元素,然后对该元素和以下prproduct同级元素进行排序
<xsl:template match="prproduct[1]">
<xsl:for-each select="self::*|following-sibling::prproduct">
<xsl:sort select="@TEC" order="descending"/>
<!-- Copy element -->
</xsl:for-each>
</xsl:template>
除此之外,您所需要的只是一个模板,以阻止其他prproduct元素输出两次
<xsl:template match="prproduct"/>
这是完整的XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="prproduct[1]">
<xsl:for-each select="self::*|following-sibling::prproduct">
<xsl:sort select="@TEC" order="descending"/>
<xsl:call-template name="identity"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="prproduct"/>
</xsl:stylesheet>
应用于XML时,将输出以下内容
<body>
<issueobject>
<page></page>
<prproduct TEC="UVA"></prproduct>
<prproduct TEC="TOR"></prproduct>
<partPage></partPage>
</issueobject>
</body>
请注意命名模板的使用,以避免标识模板的重复编码