Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在xsl中对属性及其周围的其他元素进行排序_Xml_Xslt - Fatal编程技术网

Xml 在xsl中对属性及其周围的其他元素进行排序

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" /> <

我被这个问题困扰了好几天了

我试图在对嵌套元素的属性排序时复制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: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>

请注意命名模板的使用,以避免标识模板的重复编码