使用XSLT根据另一个XML对XML数据重新排序
我有两个XSL变量,它们保存这样的数据 第一个使用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进
项目
<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>