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
Sorting XSLT 2.0从另一个样式表按变量排序_Sorting_Xslt_Xslt 2.0_Cross Reference - Fatal编程技术网

Sorting XSLT 2.0从另一个样式表按变量排序

Sorting XSLT 2.0从另一个样式表按变量排序,sorting,xslt,xslt-2.0,cross-reference,Sorting,Xslt,Xslt 2.0,Cross Reference,我需要创建XML,该XML按照从另一个XSLT中提取的数值进行排序,我使用它作为交叉引用下面的源XML(source.XML)在Partner/Header/@whse处有四个字母字符 <?xml version="1.0" encoding="UTF-8"?> <Partner partnerId="TradingPartner1"> <Header whse="NCCH" > <Contract claimNumber="00

我需要创建XML,该XML按照从另一个XSLT中提取的数值进行排序,我使用它作为交叉引用
下面的源XML(source.XML)在Partner/Header/@whse处有四个字母字符

<?xml version="1.0" encoding="UTF-8"?>
<Partner partnerId="TradingPartner1">
    <Header whse="NCCH" >
        <Contract claimNumber="00000000" />
    </Header>
    <Header whse="TXAU" >
        <Contract claimNumber="00000000" />
    </Header>
    <Header whse="LANO" >
        <Contract claimNumber="00000000" />
    </Header>
    <Header whse="MIGR">
        <Contract claimNumber="00000000" />
    </Header>
    <Header whse="TXHO">
        <Contract claimNumber="00000000" />
    </Header>
</Partner>

我需要交叉引用alpha字符以获得DUNS+4。
我使用这个XSLT(Duns_config.XSLT)来获取Duns

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="SHIPTODUNS">
    <xsl:param name="Whse" />
    <xsl:choose>
        <xsl:when test="$Whse = 'LANO'"><xsl:value-of select="'0044893600101'" /></xsl:when>
        <xsl:when test="$Whse = 'TXHO'"><xsl:value-of select="'0044893600103'" /></xsl:when>
        <xsl:when test="$Whse = 'TXAU'"><xsl:value-of select="'0044893600105'" /></xsl:when>
        <xsl:when test="$Whse = 'NCCH'"><xsl:value-of select="'0044893600214'" /></xsl:when>
        <xsl:when test="$Whse = 'MIGR'"><xsl:value-of select="'8949713340601'" /></xsl:when>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

在主XSLT(Transaction.XSLT)中,我包括Duns_config.XSLT并调用SHIPTODUNS,将数据放入变量$headerDuns中
然后我得到DUNS+4的最后三位数字,并将它们放入变量$varWhse中,然后尝试按此变量排序:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:include href="Duns_config.xslt"/> 
    <xsl:template match="Partner">
        <Partner partnerId="{./@partnerId}">
            <xsl:apply-templates select="./Header" />
        </Partner>
    </xsl:template>

    <xsl:template match="Header">
        <xsl:variable name="headerDuns">
            <xsl:call-template name = "SHIPTODUNS">
                <xsl:with-param name="Whse" select="./@whse" />
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="varWhse">           
            <xsl:value-of select="substring($headerDuns, 11, 3)" />
        </xsl:variable>
        <xsl:for-each select="current()">
        <xsl:sort select="$varWhse" />
        <transaction varwhse="{$varWhse}">
            <duns number="{$headerDuns}" />
        </transaction>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出不按$varWhse排序:

<?xml version="1.0" encoding="UTF-8"?>
<Partner partnerId="TradingPartner1">
   <transaction varwhse="214">
      <duns number="0044893600214"/>
   </transaction>
   <transaction varwhse="105">
      <duns number="0044893600105"/>
   </transaction>
   <transaction varwhse="101">
      <duns number="0044893600101"/>
   </transaction>
   <transaction varwhse="601">
      <duns number="8949713340601"/>
   </transaction>
   <transaction varwhse="103">
      <duns number="0044893600103"/>
   </transaction>
</Partner>

我希望数据的结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<Partner partnerId="TradingPartner1">
   <transaction varwhse="101">
      <duns number="0044893600101"/>
   </transaction>
   <transaction varwhse="103">
      <duns number="0044893600103"/>
   </transaction>
   <transaction varwhse="105">
      <duns number="0044893600105"/>
   </transaction>
   <transaction varwhse="214">
      <duns number="0044893600214"/>
   </transaction>
   <transaction varwhse="601">
      <duns number="8949713340601"/>
   </transaction>
</Partner>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:include href="Duns_config.xslt"/> 

    <xsl:template match="Partner">
        <Partner partnerId="{./@partnerId}">
            <xsl:variable name="mapping">
                <xsl:for-each select="Header">
                    <xsl:variable name="headerDuns">
                        <xsl:call-template name = "SHIPTODUNS">
                            <xsl:with-param name="Whse" select="@whse" />
                        </xsl:call-template>
                    </xsl:variable>
                    <xsl:variable name="varWhse">           
                        <xsl:value-of select="substring($headerDuns, 11, 3)" />
                    </xsl:variable>
                    <item>
                        <whse><xsl:value-of select="$varWhse" /></whse>
                        <duns><xsl:value-of select="$headerDuns" /></duns>
                    </item>
                </xsl:for-each>
            </xsl:variable>
            <xsl:for-each select="$mapping/item">
                <xsl:sort select="whse" />        <!-- See how xsl:sort is the first instruction -->
                <transaction varwhse="{whse}">
                    <duns number="{duns}"/>
                </transaction>
            </xsl:for-each>
        </Partner>
    </xsl:template>

</xsl:stylesheet>


有人知道我做错了什么,或者有别的方法吗<这是我在这个网站上的第一篇帖子。这是很多信息,我希望这是有意义的

代码的问题之一是,
模板中的
xsl:sort
不是第一条指令
xsl:sort
必须是第一条指令。另一个问题是排序出现在
标题
模板中,但必须在更高级别上应用。要纠正这些错误,必须对模板进行一些重构

对于以下解决方案,我选择将所有逻辑放在一个模板中-分两步进行:

  • 使用包含
    元素的子数据结构填充名为
    映射
    的变量
  • 使用排序的
    xsl:for each
    遍历该变量,并输出
    事务
    元素
  • 结果如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <Partner partnerId="TradingPartner1">
       <transaction varwhse="101">
          <duns number="0044893600101"/>
       </transaction>
       <transaction varwhse="103">
          <duns number="0044893600103"/>
       </transaction>
       <transaction varwhse="105">
          <duns number="0044893600105"/>
       </transaction>
       <transaction varwhse="214">
          <duns number="0044893600214"/>
       </transaction>
       <transaction varwhse="601">
          <duns number="8949713340601"/>
       </transaction>
    </Partner>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:include href="Duns_config.xslt"/> 
    
        <xsl:template match="Partner">
            <Partner partnerId="{./@partnerId}">
                <xsl:variable name="mapping">
                    <xsl:for-each select="Header">
                        <xsl:variable name="headerDuns">
                            <xsl:call-template name = "SHIPTODUNS">
                                <xsl:with-param name="Whse" select="@whse" />
                            </xsl:call-template>
                        </xsl:variable>
                        <xsl:variable name="varWhse">           
                            <xsl:value-of select="substring($headerDuns, 11, 3)" />
                        </xsl:variable>
                        <item>
                            <whse><xsl:value-of select="$varWhse" /></whse>
                            <duns><xsl:value-of select="$headerDuns" /></duns>
                        </item>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:for-each select="$mapping/item">
                    <xsl:sort select="whse" />        <!-- See how xsl:sort is the first instruction -->
                    <transaction varwhse="{whse}">
                        <duns number="{duns}"/>
                    </transaction>
                </xsl:for-each>
            </Partner>
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    其输出为:

    <?xml version="1.0" encoding="UTF-8"?>
    <Partner partnerId="TradingPartner1">
       <transaction varwhse="101">
          <duns number="0044893600101"/>
       </transaction>
       <transaction varwhse="103">
          <duns number="0044893600103"/>
       </transaction>
       <transaction varwhse="105">
          <duns number="0044893600105"/>
       </transaction>
       <transaction varwhse="214">
          <duns number="0044893600214"/>
       </transaction>
       <transaction varwhse="601">
          <duns number="8949713340601"/>
       </transaction>
    </Partner>
    
    
    

    这是需要的。

    代码的问题之一是
    标题中的
    xsl:sort
    不是第一条指令
    xsl:sort
    必须是第一条指令。另一个问题是排序出现在
    标题
    模板中,但必须在更高级别上应用。要纠正这些错误,必须对模板进行一些重构

    对于以下解决方案,我选择将所有逻辑放在一个模板中-分两步进行:

  • 使用包含
    元素的子数据结构填充名为
    映射
    的变量
  • 使用排序的
    xsl:for each
    遍历该变量,并输出
    事务
    元素
  • 结果如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <Partner partnerId="TradingPartner1">
       <transaction varwhse="101">
          <duns number="0044893600101"/>
       </transaction>
       <transaction varwhse="103">
          <duns number="0044893600103"/>
       </transaction>
       <transaction varwhse="105">
          <duns number="0044893600105"/>
       </transaction>
       <transaction varwhse="214">
          <duns number="0044893600214"/>
       </transaction>
       <transaction varwhse="601">
          <duns number="8949713340601"/>
       </transaction>
    </Partner>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:include href="Duns_config.xslt"/> 
    
        <xsl:template match="Partner">
            <Partner partnerId="{./@partnerId}">
                <xsl:variable name="mapping">
                    <xsl:for-each select="Header">
                        <xsl:variable name="headerDuns">
                            <xsl:call-template name = "SHIPTODUNS">
                                <xsl:with-param name="Whse" select="@whse" />
                            </xsl:call-template>
                        </xsl:variable>
                        <xsl:variable name="varWhse">           
                            <xsl:value-of select="substring($headerDuns, 11, 3)" />
                        </xsl:variable>
                        <item>
                            <whse><xsl:value-of select="$varWhse" /></whse>
                            <duns><xsl:value-of select="$headerDuns" /></duns>
                        </item>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:for-each select="$mapping/item">
                    <xsl:sort select="whse" />        <!-- See how xsl:sort is the first instruction -->
                    <transaction varwhse="{whse}">
                        <duns number="{duns}"/>
                    </transaction>
                </xsl:for-each>
            </Partner>
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    其输出为:

    <?xml version="1.0" encoding="UTF-8"?>
    <Partner partnerId="TradingPartner1">
       <transaction varwhse="101">
          <duns number="0044893600101"/>
       </transaction>
       <transaction varwhse="103">
          <duns number="0044893600103"/>
       </transaction>
       <transaction varwhse="105">
          <duns number="0044893600105"/>
       </transaction>
       <transaction varwhse="214">
          <duns number="0044893600214"/>
       </transaction>
       <transaction varwhse="601">
          <duns number="8949713340601"/>
       </transaction>
    </Partner>
    
    
    

    这是需要的。

    在获得
    选择的结果后应用排序。发生的情况是,您仍然在生成xml输出,但您正在对其进行
    标题
    项级别的排序

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:include href="Duns_config.xslt"/> 
        <xsl:template match="Partner">
            <xsl:variable name="partial">
                <PartnerTemp partnerId="{./@partnerId}">
                    <xsl:apply-templates select="./Header" />
                </PartnerTemp>
            </xsl:variable>
            <xsl:apply-templates select="$partial"></xsl:apply-templates>
        </xsl:template>
        <xsl:template match="PartnerTemp">
            <Partner partnerId="{./@partnerId}">
                <xsl:perform-sort select="transaction">
                    <xsl:sort select="@varwhse"/>
                </xsl:perform-sort>
            </Partner>
        </xsl:template>
        <xsl:template match="Header">
            <xsl:variable name="headerDuns">
                <xsl:call-template name = "SHIPTODUNS">
                    <xsl:with-param name="Whse" select="./@whse" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="varWhse">           
                <xsl:value-of select="substring($headerDuns, 11, 3)" />
            </xsl:variable>
    
            <xsl:for-each select="current()">               
                <transaction varwhse="{$varWhse}">              
                    <duns number="{$headerDuns}" />
                </transaction>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    

    在获得
    选择的结果后应用排序。发生的情况是,您仍然在生成xml输出,但您正在对其进行
    标题
    项级别的排序

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:include href="Duns_config.xslt"/> 
        <xsl:template match="Partner">
            <xsl:variable name="partial">
                <PartnerTemp partnerId="{./@partnerId}">
                    <xsl:apply-templates select="./Header" />
                </PartnerTemp>
            </xsl:variable>
            <xsl:apply-templates select="$partial"></xsl:apply-templates>
        </xsl:template>
        <xsl:template match="PartnerTemp">
            <Partner partnerId="{./@partnerId}">
                <xsl:perform-sort select="transaction">
                    <xsl:sort select="@varwhse"/>
                </xsl:perform-sort>
            </Partner>
        </xsl:template>
        <xsl:template match="Header">
            <xsl:variable name="headerDuns">
                <xsl:call-template name = "SHIPTODUNS">
                    <xsl:with-param name="Whse" select="./@whse" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="varWhse">           
                <xsl:value-of select="substring($headerDuns, 11, 3)" />
            </xsl:variable>
    
            <xsl:for-each select="current()">               
                <transaction varwhse="{$varWhse}">              
                    <duns number="{$headerDuns}" />
                </transaction>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    
    
    
    谢谢您的帮助。我能够将其应用到XSLT中,并获得所需的结果!!我从来没有想过一个变量里面有一个变量。。。更不用说一个里面有两个:)。这实际上打开了一个完全不同的思维方式来解决我在未来遇到的问题!!!!谢谢你的帮助。我能够将其应用到XSLT中,并获得所需的结果!!我从来没有想过在一个变量中有一个变量