XSLT 2.0 按另一种样式的变量排序 sheet

XSLT 2.0 Sort by variable from another style sheet

我需要创建 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>

我需要交叉引用字母字符以获得 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>

有人看到我做错了什么或有其他方法吗?
这是我第一次 post 访问此站点。这是很多信息,我希望它有意义。

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

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

  1. 用包含 item 个元素的子数据结构填充名为 mapping 的变量。
  2. 使用 sorted xsl:for-each 迭代该变量并输出 transaction 元素。

结果如下所示:

<?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>

如愿。

得到choose的结果后进行排序。发生的事情是您仍在生成 xml 输出,但您在 Header 项目级别对其进行排序。

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