我有一个大约这种xml:
<charge>
<price></price>
<amount></amount>
<name>
<KeyValuePair>
<Key>
en-us
</Key>
<Value>
Name in english
</Value>
</KeyValuePair>
<KeyValuePair>
<Key>
ru-ru
</Key>
<Value>
Name in russian
</Value>
</KeyValuePair>
</name>
</charge>
如何按具有固定语言的名称字段对费用进行分组?例如,使用 xlt 1.0 按英文版名称分组收费?我想存在 for-each-group 的 xslt 2.0 不会有问题。但在 1.0 中,我什至无法创建带有复杂指令的 xsl:key。
<charge>
<price>2</price>
<amount>3</amount>
<name>
<KeyValuePair>
<key>en-us</key>
<value>mobile</value>
</KeyValuePair>
</name>
</charge>
<charge>
<price>4</price>
<amount>3</amount>
<name>
<KeyValuePair>
<key>en-us</key>
<value>mobile</value>
</KeyValuePair>
</name>
</charge>
<charge>
<price>6</price>
<amount>3</amount>
<name>
<KeyValuePair>
<key>en-us</key>
<value>computer</value>
</KeyValuePair>
</name>
</charge>
<charge>
<price>8</price>
<amount>3</amount>
<name>
<KeyValuePair>
<key>en-us</key>
<value>computer</value>
</KeyValuePair>
</name>
</charge>
恩-我们
非常近似:我希望我的 xslt 渲染像这样转换它:
mobile 6
computer 14
它按名称对费用进行分组并汇总价格。我们有一个获取翻译的复杂规则: 1. 我们定义一种默认语言 - 如果我们没有在 XML 中指定这种语言,我们为 xslt 采用默认语言(由开发人员手动设置)。2. 如果节点没有默认语言的翻译,我们在 FallbackLanguage(always en-us) 上检查翻译。3.如果我们之前没有指定翻译,我们设置一个翻译值为[NO NAME]
我的想法是将翻译逻辑封装到单独的模板中:
<xsl:variable name="ChargesForDisplay">
<xsl:for-each select="/i:Invoice/i:Charges/i:Charge[not(@*[1]='TaxCharge')]">
<chargeset>
<chargeName>
<xsl:call-template name="GetLocalizedEntity">
<xsl:with-param name="ContainerPath" select="./i:Product/i:Name"></xsl:with-param>
</xsl:call-template>
</chargeName>
<charge>
<xsl:value-of select="current()"/>
</charge>
</chargeset>
</xsl:for-each>
</xsl:variable>
所以在那之后我想让变量 ChargesToDisplay 由许多对组成,看起来像
<name>SomeName</name>
<Charge>.... Charge content ....<Charge>
并在 ChargesToDisplay 上进行所有分组。GetLocalizedEntity 实现:
<xsl:template name ="GetLocalizedEntity">
<xsl:param name="ContainerPath"></xsl:param>
<xsl:choose>
<xsl:when test="$ContainerPath/a:KeyValueOfstringstring[a:Key=$TemplateLanguage]/a:Value != ''">
<xsl:value-of select="$ContainerPath/a:KeyValueOfstringstring[a:Key=$TemplateLanguage]/a:Value"/>
</xsl:when>
<xsl:when test="$ContainerPath/a:KeyValueOfstringstring[a:Key=$FallBackLanguage]/a:Value != ''">
<xsl:value-of select="$ContainerPath/a:KeyValueOfstringstring[a:Key=$FallBackLanguage]/a:Value"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>[NO NAME]</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>