使用XSLT根据另一个XML对XML数据重新排序

使用XSLT根据另一个XML对XML数据重新排序,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有两个XSL变量,它们保存这样的数据 第一个项目 <values> <value> 12635 </value> <value> SD20 </value> <value> 2404 </value> <value> 3586877 </value> </values> 我想根据项目的顺序对syddata进

我有两个XSL变量,它们保存这样的数据 第一个
项目

 <values>
  <value>
    12635
  </value>
  <value>
    SD20
  </value>
  <value>
    2404
  </value>
   <value>
    3586877
  </value>
</values>
我想根据
项目的顺序对
syddata
进行排序。意思是
项目中的
value
字段与
syddata
中的
Varenummer
字段相同。我想将其用作键并排序
syddata
预期输出如下

    <syddata lastUpdated="07.11.2013 11:06 ">
  <data Varenummer="12635" Varenavn="tesr" Brand="Kähcddler" ></data>
  <data Varenummer="SD20" Varenavn="sfggh" Brand="dghgh" ></data>
  <data Varenummer="2404" Varenavn="uhjy" Brand="Pitcfrhstone" ></data>
  <data Varenummer="3586877" Varenavn="Liqudffid s" Brand="Georg Jensen" ></data>
</syddata>  

 
我在这里添加了我的整个XSLT,以了解工作流是如何工作的

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:XSLTHelper="urn:XSLTHelper"
   xmlns:exslt="http://exslt.org/common"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
  exclude-result-prefixes=" msxsl msxml ">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:param name="currentPage"/>
  <xsl:template match="/">
        <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
        <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>
  </xsl:template>

</xsl:stylesheet>

为了提高效率,我首先要定义一个键(在任何
之外)


每个
的内部
只是一次迭代,但关键是将“当前文档”切换到
$syddata
,因此
函数查找
数据
元素,而不是
$items

为了提高效率,我首先定义一个键(在任何
之外)


每个
的内部
只是一次迭代,但关键是要将“当前文档”切换到
$syddata
,这样
函数将查找
数据
元素,而不是可以在XSLT 2.0中排序的
$items

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:XSLTHelper="urn:XSLTHelper"
   xmlns:exslt="http://exslt.org/common"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
  exclude-result-prefixes=" msxml ">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:param name="currentPage"/>
  <xsl:template match="/">
        <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
        <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>

        <xsl:variable name="sorted">
          <xsl:apply-templates select="$syddata" mode="sort">
            <xsl:with-param name="values" select="$items/values/value/normalize-space()"/>
          </xsl:apply-templates>
        </xsl:variable>
        <xsl:copy-of select="$sorted"/>
  </xsl:template>

  <xsl:template match="syddata" mode="sort">
    <xsl:param name="values"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:perform-sort select="data">
        <xsl:sort select="index-of($values, @Varenummer)"/>
      </xsl:perform-sort>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

您可以在XSLT 2.0中进行排序:

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:XSLTHelper="urn:XSLTHelper"
   xmlns:exslt="http://exslt.org/common"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
  exclude-result-prefixes=" msxml ">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:param name="currentPage"/>
  <xsl:template match="/">
        <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
        <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>

        <xsl:variable name="sorted">
          <xsl:apply-templates select="$syddata" mode="sort">
            <xsl:with-param name="values" select="$items/values/value/normalize-space()"/>
          </xsl:apply-templates>
        </xsl:variable>
        <xsl:copy-of select="$sorted"/>
  </xsl:template>

  <xsl:template match="syddata" mode="sort">
    <xsl:param name="values"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:perform-sort select="data">
        <xsl:sort select="index-of($values, @Varenummer)"/>
      </xsl:perform-sort>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>


这是XSLT 1.0还是2.0?样式表中有
version=“2.0”
,还有exslt和msxsl扩展名称空间的声明,这表明处理器实际上是1.0?@IanRoberts很抱歉..它的XSLT 2。0@IanRoberts将实际情况留待片刻。您能告诉我如何确定哪一个是我的XSLT处理器吗?我正在使用cms umbraco…或任何我可以查看basic的资源这些细节我很确定Umbraco使用的是标准的Microsoft XSLT处理器,即1.0。这是XSLT 1.0还是2.0?样式表中有
version=“2.0”
,还有exslt和msxsl扩展名称空间的声明,这表明处理器实际上是1.0?@IanRoberts很抱歉..它的XSLT 2。0@IanRoberts将实际情况留待片刻。您能告诉我如何确定哪一个是我的XSLT处理器吗?我正在使用cms umbraco…或任何我可以查看basic的资源详细信息如R theser我很确定Umbraco使用标准的Microsoft XSLT处理器,即1.0。我在尝试保存代码时遇到此错误。xmlns:xsl=”“具有无效的子元素perform sort..@AKS,这意味着您的处理器实际上是XSLT 1.0,而不是2.0。我在尝试保存代码时遇到此错误。xmlns:xsl=”“具有无效的子元素perform sort..@AKS,这意味着您的处理器实际上是XSLT 1.0,而不是2.0。
<xsl:template match="/">
    <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
    <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>

    <xsl:element name="{name($syddata/*)}">
      <!-- copy attributes -->
      <xsl:sequence select="$syddata/*/@*" />
      <!-- copy data in the right order -->
      <xsl:sequence select="
          for $id in $items//value
          return key('dataByNummer', normalize-space($id), $syddata)" />
    </xsl:element>
</xsl:template>
<xsl:template match="/">
    <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
    <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>

    <xsl:element name="{name($syddata/*)}">
      <!-- copy attributes -->
      <xsl:copy-of select="$syddata/*/@*" />
      <!-- copy data in the right order -->
      <xsl:for-each select="$items//value">
        <xsl:variable name="curValue" select="." />
        <xsl:for-each select="$syddata"><!-- switch focus for the key function -->
          <xsl:copy-of select="key('dataByNummer', normalize-space($curValue))" />
        </xsl:for-each>
      </xsl:for-each>
    </xsl:element>
</xsl:template>
<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:XSLTHelper="urn:XSLTHelper"
   xmlns:exslt="http://exslt.org/common"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
  exclude-result-prefixes=" msxml ">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:param name="currentPage"/>
  <xsl:template match="/">
        <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/>
        <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/>

        <xsl:variable name="sorted">
          <xsl:apply-templates select="$syddata" mode="sort">
            <xsl:with-param name="values" select="$items/values/value/normalize-space()"/>
          </xsl:apply-templates>
        </xsl:variable>
        <xsl:copy-of select="$sorted"/>
  </xsl:template>

  <xsl:template match="syddata" mode="sort">
    <xsl:param name="values"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:perform-sort select="data">
        <xsl:sort select="index-of($values, @Varenummer)"/>
      </xsl:perform-sort>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>