根据给定的顺序排序信息

时间:2015-12-23 11:32:38

标签: xslt xslt-2.0

请根据给定的排序顺序(Seq.xml)建议如何对信息进行排序。

这里从文件夹中获取信息'名称应该排序##。xml'格式。输出应根据DOI号进行排序,如外部文件中给出的顺序' D:\ Sort \ Seq.xml'。

输入XML:

d:\排序\ Sort01.xml

<article>
<fm>
    <title>The solar system</title>
    <aug><au>Rudramuni TP</au></aug>
    <doi>10.11/MPS.0.10.11</doi>
</fm>
<body><text>The text</text></body>
</article>

d:\排序\ Sort02.xml

<article>
<fm>
    <title>The Galaxy</title>
    <aug><au>Kishan TR</au></aug>
    <doi>10.11/MPS.0.10.2</doi>
</fm>
<body><text>The text</text></body>
</article>

d:\排序\ Sort03.xml

<article>
<fm>
    <title>The Pluto</title>
    <aug><au>Kowshik MD</au></aug>
    <doi>10.11/MPS.0.10.10</doi>
</fm>
<body><text>The text</text></body>
</article>

D:\ Sort \ Seq.xml

中的序列信息
<root>
<toc>
    <seq seq="1"><art-id>10.11/MPS.0.10.2</art-id></seq>
    <seq seq="2"><art-id>10.11/MPS.0.10.11</art-id></seq>
    <seq seq="3"><art-id>10.11/MPS.0.10.10</art-id></seq>
</toc>
</root>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="varCollection">

<xsl:copy-of select="
    collection('file:///D:/Sort/?select=Sort*.xml; recurse=yes')
    [matches(document-uri(.),'Sort/Sort[0-9][0-9].xml')]"/>
</xsl:variable><!-- to fetch info from folder 'Sort*.xml' s -->

<xsl:variable name="docSeq" select="document('D:/Sort/Seq.xml')"/><!--In this file, sequnce info is there -->

<!--xsl:key name="kSeq" match="$docSeq/root/toc/seq/@seq" use="art-id"/--><!-- I tried with key, but unable to get the required sequence -->

<xsl:template match="root">
    <xsl:for-each select="$varCollection/article">
        <!--xsl:sort select="key('kSeq', fm/doi)"/-->
        <art>
            <title><xsl:value-of select="fm/title"/></title>
            <Name><xsl:value-of select="fm/aug/au"/></Name>
            <DOI><xsl:value-of select="fm/doi"/></DOI>
        </art><xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

必需的序列

<art><title>The Galaxy</title><Name>Kishan TR</Name><DOI>10.11/MPS.0.10.2</DOI></art>
<art><title>The solar system</title><Name>Rudramuni TP</Name><DOI>10.11/MPS.0.10.11</DOI></art>
<art><title>The Pluto</title><Name>Kowshik MD</Name><DOI>10.11/MPS.0.10.10</DOI></art>

2 个答案:

答案 0 :(得分:3)

我想你想要

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="varCollection" select="
    collection('file:///D:/Sort/?select=Sort*.xml; recurse=yes')
    [matches(document-uri(.),'Sort/Sort[0-9][0-9].xml')]"/>


<xsl:variable name="docSeq" select="document('file:///D:/Sort/Seq.xml')"/><!--In this file, sequnce info is there -->

<xsl:key name="kSeq" match="root/toc/seq" use="art-id"/>

<xsl:template match="root">
    <xsl:for-each select="$varCollection/article">
        <xsl:sort select="key('kSeq', fm/doi, $docSeq)/xs:integer(@seq)"/>
        <art>
            <title><xsl:value-of select="fm/title"/></title>
            <Name><xsl:value-of select="fm/aug/au"/></Name>
            <DOI><xsl:value-of select="fm/doi"/></DOI>
        </art>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

你也可以从相反的方向做到这一点:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:variable name="varCollection">
    <xsl:sequence select="collection('file:///D:/Sort/?select=Sort*.xml; recurse=yes')
    [matches(document-uri(.),'Sort/Sort[0-9][0-9].xml')]"/>
</xsl:variable>

<xsl:variable name="docSeq" select="document('D:/Sort/Seq.xml')"/>

<xsl:key name="article" match="article" use="fm/doi" />

<xsl:template match="root">
    <xsl:for-each select="$docSeq/root/toc/seq">
        <xsl:sort select="@seq" data-type="number" order="ascending"/>
        <xsl:apply-templates select="key('article', art-id, $varCollection)"/>
     </xsl:for-each>    
</xsl:template>

<xsl:template match="article">
    <art>
        <title><xsl:value-of select="fm/title"/></title>
        <Name><xsl:value-of select="fm/aug/au"/></Name>
        <DOI><xsl:value-of select="fm/doi"/></DOI>
    </art>
</xsl:template>

</xsl:stylesheet>

请注意,输出缺少根元素。