我必须根据数据中的字符数对XML输出进行排序。到目前为止,我还没有在XSLT 1.0中找到它。以下是我的工作内容:
源XML文件:
<ROOT>
<REPLIST>
<NAME>ABCDE.xml</NAME>
<NAME>ABCDEFGH.xml</NAME>
<NAME>ABC.xml</NAME>
<NAME>ABCDEFG.xml</NAME>
<NAME>ABCD.xml</NAME>
<NAME>ABCDEF.xml</NAME>
<NAME>JKLMNOPQRST.xml</NAME>
<NAME>JKLMNOPQRS.xml</NAME>
<NAME>JKLMNOPQ.xml</NAME>
<NAME>JKLMN.xml</NAME>
</REPLIST>
<DATALIST>
<ExtractedName>ABCDEFGH.xml</ExtractedName>
<ExtractedName>JKLMN.xml</ExtractedName>
<ExtractedName>ABCDEFG.xml</ExtractedName>
<ExtractedName>ABCD.xml</ExtractedName>
<ExtractedName>JKLMNOPQRST.xml</ExtractedName>
<ExtractedName>ABCDEFG.xml</ExtractedName>
</DATALIST>
</ROOT>
输出
<TestData>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>ABCD</FormName>
<FormName>JKLMNOPQRST</FormName>
<FormName>JKLMN</FormName>
</TestData>
期望的输出:
<TestData>
<FormName>JKLMNOPQRST</FormName>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>JKLMN</FormName>
<FormName>ABCD</FormName>
</TestData>
样式表(1.0):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/>
<xsl:template match="/">
<TestData>
<xsl:apply-templates/>
</TestData>
</xsl:template>
<xsl:template match="/ROOT/REPLIST/NAME[.=/ROOT/DATALIST/ExtractedName]">
<FormName>
<xsl:value-of select="translate(.,'.xml','')"/>
</FormName>
</xsl:template>
<xsl:template match="text()">
</xsl:template>
对此有任何帮助将不胜感激。
答案 0 :(得分:1)
以下是您可以这样做的方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:output method="xml" omit-xml-declaration="yes" standalone="no"/>
<xsl:key name="kExtract" match="ExtractedName" use="."/>
<xsl:template match="/ROOT">
<TestData>
<xsl:apply-templates select="REPLIST/NAME[key('kExtract', .)]">
<xsl:sort select="string-length(substring-before(., '.xml'))"
data-type="number" order="descending"/>
</xsl:apply-templates>
</TestData>
</xsl:template>
<xsl:template match="REPLIST/NAME">
<FormName>
<xsl:value-of select="substring-before(., '.xml')"/>
</FormName>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行时,会产生:
<TestData>
<FormName>JKLMNOPQRST</FormName>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>JKLMN</FormName>
<FormName>ABCD</FormName>
</TestData>
答案 1 :(得分:1)
更短,更简单,更强大的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kNameByVal" match="NAME" use="."/>
<xsl:template match="REPLIST">
<TestData>
<xsl:apply-templates select=
"key('kNameByVal', /*/DATALIST/*)">
<xsl:sort select="-string-length()" data-type="number"/>
</xsl:apply-templates>
</TestData>
</xsl:template>
<xsl:template match="NAME">
<FormName><xsl:value-of select="substring(.,1, string-length()-4)"/></FormName>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<ROOT>
<REPLIST>
<NAME>ABCDE.xml</NAME>
<NAME>ABCDEFGH.xml</NAME>
<NAME>ABC.xml</NAME>
<NAME>ABCDEFG.xml</NAME>
<NAME>ABCD.xml</NAME>
<NAME>ABCDEF.xml</NAME>
<NAME>JKLMNOPQRST.xml</NAME>
<NAME>JKLMNOPQRS.xml</NAME>
<NAME>JKLMNOPQ.xml</NAME>
<NAME>JKLMN.xml</NAME>
</REPLIST>
<DATALIST>
<ExtractedName>ABCDEFGH.xml</ExtractedName>
<ExtractedName>JKLMN.xml</ExtractedName>
<ExtractedName>ABCDEFG.xml</ExtractedName>
<ExtractedName>ABCD.xml</ExtractedName>
<ExtractedName>JKLMNOPQRST.xml</ExtractedName>
<ExtractedName>ABCDEFG.xml</ExtractedName>
</DATALIST>
</ROOT>
产生了想要的正确结果:
<TestData>
<FormName>JKLMNOPQRST</FormName>
<FormName>ABCDEFGH</FormName>
<FormName>ABCDEFG</FormName>
<FormName>JKLMN</FormName>
<FormName>ABCD</FormName>
</TestData>