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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Xslt 仅对特定XML节点排序_Xslt_Sorting - Fatal编程技术网

Xslt 仅对特定XML节点排序

Xslt 仅对特定XML节点排序,xslt,sorting,Xslt,Sorting,我只需要对以下文件的节点(通过子节点)进行排序: <TransActDO clear="true" removed="false"> <stmt-reason-code>1001</stmt-reason-code> <Transaction-Detail clear="true" removed="false"> <txn-amt>788.20</txn-amt> <txn-descripti

我只需要对以下文件的
节点(通过
子节点)进行排序:

<TransActDO clear="true" removed="false">
  <stmt-reason-code>1001</stmt-reason-code>
  <Transaction-Detail clear="true" removed="false">
    <txn-amt>788.20</txn-amt>
    <txn-description>New Purchase</txn-description>
    <tran-id>3271</tran-id>
  </Transaction-Detail>
  <Transaction-Detail clear="true" removed="false">
    <txn-amt>-68.20</txn-amt>
    <txn-description>Return</txn-description>
    <tran-id>27795</tran-id>
  </Transaction-Detail>
  <Transaction-Detail clear="true" removed="false">
    <txn-amt>0.00</txn-amt>
    <txn-description>Comment</txn-description>
    <transaction-reason-desc>No Reason</transaction-reason-desc>
    <tran-id>13365</tran-id>
    <transaction-reason-code>0</transaction-reason-code>
  </Transaction-Detail>
  <Transaction-Detail clear="true" removed="false">
    <txn-amt>343.45</txn-amt>
    <txn-description>New Purchase</txn-description>
    <tran-id>7558</tran-id>
  </Transaction-Detail>
  <Transaction-Detail clear="true" removed="false">
    <txn-amt>0.00</txn-amt>
    <txn-description>Comment</txn-description>
    <transaction-reason-desc>No Reason</transaction-reason-desc>
    <tran-id>6512</tran-id>
    <transaction-reason-code>0</transaction-reason-code>
  </Transaction-Detail>
  <account-no>123456789</account-no>
  <payer-name>JOHN DOE</payer-name>
  <Product-Detail clear="true" removed="false">
    <Name>WIDGET</Name>
    <Amount>89.00</Amount>
  </Product-Detail>
  <Product-Detail clear="true" removed="false">
    <Name>NEWER WIDGET</Name>
    <Amount>99.99</Amount>
  </Product-Detail>
  <stmt-reason-desc>Web Statement</stmt-reason-desc>
  <type>Original</type>
</TransActDO>

1001
788.20
新购
3271
-68.20
返回
27795
0
评论
没有理由
13365
0
343.45
新购
7558
0
评论
没有理由
6512
0
123456789
无名氏
小装置
89
更新的小部件
99.99
网络声明
起初的
输出是XML,还需要从原始文件复制所有其他节点和属性。本质上,复制所有内容,只需对事务细节节点进行排序

我已经做到了这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="TransActDO">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="Transaction-Detail">
        <xsl:sort select="tran-id" data-type="number" order="ascending"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

这将生成一个正确排序的XML文件,其中只包含事务细节节点及其子节点。每当我试图添加额外的逻辑来复制其余的节点时,排序就会中断

我想我在XSLT执行理论和语法方面遇到了困难

非常感谢您的帮助
-第n步-

这样就可以了:-

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="Windows-1252"  />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="TransActDO">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(preceding-sibling::Transaction-Detail) and not(self::Transaction-Detail)]"/>
            <xsl:apply-templates select="Transaction-Detail">
                <xsl:sort select="tran-id" data-type="number" order="ascending"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="@*|node()[not(following-sibling::Transaction-Detail) and not(self::Transaction-Detail)]"/>
    </xsl:copy>
    </xsl:template>


</xsl:stylesheet>

如果您不介意将Transaction Detail元素移动到Transact-DO元素的顶部或底部,则可以将应用模板的内部集合简化为:-

            <xsl:apply-templates select="@*|node()[not(self::Transaction-Detail)]"/>
            <xsl:apply-templates select="Transaction-Detail">
                <xsl:sort select="tran-id" data-type="number" order="ascending"/>
            </xsl:apply-templates>


您需要在事务详细信息节点集合前面的节点保持在顶部,后面的节点保持在底部,还是不能将事务详细信息节点移动到XMl的底部?(顺便说一句,出于传统原因,我假设您不能仅仅重新设计XML,使产品详细信息和事务详细信息等都有一个包含父节点,这样它们就不会有具有不同标记名的同级)+1。我刚刚注意到您发布的代码与我刚刚发布的代码完全相同(我想我应该阅读您的第二个代码示例…)。删除我的答案以避免冗余。谢谢Anthony。它确实起作用了!不幸的是,我无法控制xml结构的创建,但这至少可以解决排序问题。