示例XML:
<term>
<name>facies</name>
<translation language="en">facies</translation>
<definition><num>1.</num> cara <num>2.</num> superficie externa, superficie anterior</definition>
</term>
<term>
<name>factores angiógenos</name>
<translation language="en">angiogenic factors</translation>
<definition>descripción de sustancias que favorecen el desarrollo o la formación nueva de vasos sanguíneos</definition>
</term>
<term>
<name>factores de la coagulación</name>
<translation language="en">coagulation factors</translation>
<definition>la cascada de la coagulación de la sangre consta de 12 factores en total, todos ellos necesarios para que funcione bien</definition>
</term>
我有一个XSLT文件,它创建一个映射到name的名称列表,以及一个存在的翻译。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="terms">
var allwords = [
<xsl:for-each select="letter">
<xsl:for-each select="term">
<xsl:call-template name="term"></xsl:call-template>
</xsl:for-each>
</xsl:for-each>
['','']
];
</xsl:template>
<xsl:template name="term">
['<xsl:value-of select="name"/>', '<xsl:value-of select="name"/>'],
<xsl:if test="name!=translation">
['<xsl:value-of select="translation"/>', '<xsl:value-of select="name"/>'],
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这很好,产生以下
var allwords =
[ ['facies', 'facies'],
['factores angiógenos', 'factores angiógenos'],
['angiogenic factors', factores angiógeno],
['factores de la coagulació', 'factores de la coagulació']
etc...
但是,正如您所看到的那样,由于添加了英语单词,数组中的第一部分不再按字母顺序排列。
它需要按字母顺序排列,因此在这种情况下,“血管生成因子”将是阵列中的第一个元素
有什么想法吗?
答案 0 :(得分:2)
Definition and Usage
The <xsl:sort> element is used to sort the output.
Note: <xsl:sort> is always within <xsl:for-each> or <xsl:apply-templates>.
答案 1 :(得分:1)
我认为就这么简单:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="windows-1252" omit-xml-declaration="yes"/>
<xsl:template match="/*">
var allwords = [
<xsl:apply-templates select="term">
<!-- key to success -->
<xsl:sort select="name"/>
</xsl:apply-templates>
];
</xsl:template>
<xsl:template match="term">
['<xsl:value-of select="name" />',
'<xsl:value-of select="translation[@language='en']" />']
<xsl:if test="position() != last()">,</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出(抱歉,必须从测试输入中删除“有趣”字符)
var allwords = [
['facies', 'facies'],
['factores angiogenos', 'angiogenic factors'],
['factores de la coagulacio', 'coagulation factors']
];
(换行符和缩进在原始输出中略有不同。我更改了它们,看起来不错。)
我认为你不知道<xsl:sort/>
,在XSL样式表中标有<!-- key to success -->
。 ; - )
答案 2 :(得分:0)
是的,需要多一点思考才能排序:p
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="terms">
var allwords = [
<xsl:for-each select="letter/term/name | letter/term/translation">
<xsl:sort order="ascending" select="."/>
<xsl:call-template name="term"></xsl:call-template>
</xsl:for-each>
['','']
];
</xsl:template>
<xsl:template name="term">
['<xsl:value-of select="."/>', '<xsl:value-of select="./../name"/>'],
</xsl:template>
</xsl:stylesheet>
基本上,您需要能够选择名称和翻译,然后按两者进行排序。然后必须对模板进行一些编辑,因为它现在正在接收子元素而不是父元素。
答案 3 :(得分:0)
这是我对你要做的事情的最好猜测。给出以下示例XML:
<terms>
<letter name="f">
<term>
<name>facies</name>
<translation language="en">facies</translation>
<definition>
<num>1.</num> cara <num>2.</num> superficie externa, superficie anterior
</definition>
</term>
<term>
<name>factores angiógenos</name>
<translation language="en">angiogenic factors</translation>
<definition>descripción de sustancias que favorecen el desarrollo o la formación nueva de vasos sanguíneos</definition>
</term>
<term>
<name>factores de la coagulación</name>
<translation language="en">coagulation factors</translation>
<definition>la cascada de la coagulación de la sangre consta de 12 factores en total, todos ellos necesarios para que funcione bien</definition>
</term>
</letter>
对每个字母的翻译进行排序:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="terms">
var allwords = [
<xsl:apply-templates select="letter">
<xsl:sort select="name"/>
</xsl:apply-templates>
];
</xsl:template>
<xsl:template match="letter">
<xsl:apply-templates select="term">
<xsl:sort select="translation"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="term">
['<xsl:value-of select="translation"/>', '<xsl:value-of select="name"/>']
<xsl:if test="not(position() = last())">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:template>