2012-01-10 85 views
1

一饮而尽第一篇文章排序....XSL |通过查找文件

现状

我用两个XML文件为我的XSL转换。 File1处理存储,而File2存储布局信息。

数据

<item id="1100326"> 
    <node1> ... </node1> 
    [...] 
</item> 

布局

<topnews> 
    <item vieworder="1">1100326</item> 
    <item vieworder="2">1100724</item> 
</topnews> 


我设法 “提取” 的布局XML仅仅列出的节点:

<xsl:for-each select="item[@id=document($document)//topnews/item]" /> 


的问题

我有严重的麻烦,通过从layoutXML的vieworder属性对数据进行排序。我会感谢任何帮助,并愿意向大师学习! :)

回答

0

+1对于一个好的第一个问题。这是我会怎么做....

data.xml中

<doc> 
    <item id="1100724"> 
    <node1>Should be second.</node1> 
    </item> 
    <item id="1100326"> 
    <node1>Should be first.</node1> 
    </item> 
</doc> 

layout.xml

<topnews> 
    <item vieworder="1">1100326</item> 
    <item vieworder="2">1100724</item> 
</topnews> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/doc"> 
    <doc> 
     <xsl:apply-templates select="item"> 
     <xsl:sort select="document('layout.xml')/topnews/item[.=current()/@id]/@vieworder" data-type="number"/> 
     </xsl:apply-templates>  
    </doc> 
    </xsl:template> 

</xsl:stylesheet> 

的Output.xml

<doc> 
    <item id="1100326"> 
     <node1>Should be first.</node1> 
    </item> 
    <item id="1100724"> 
     <node1>Should be second.</node1> 
    </item> 
</doc> 
0

您可以使用XSLT 2.0(撒克逊由9或AltovaXML作为支持)?

因此,你可以简单地做

<xsl:variable name="layout-doc" select="document('layout.xml')"/> 

<xsl:key name="k1" match="topnews/item" use="."/> 

<xsl:template match="/"> 
    <xsl:for-each select="//item[key('k1', @id, $layout-doc)]"> 
    <xsl:sort select="xs:integer(key('k1', @id, $layout-doc)/@vieworder)"/> 
    </xsl:for-each> 
</xsl:template>