私はほぼこの種の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が存在するxslt2.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>
en-us
おおよそ:xsltレンダリングで次のように変換したい:
mobile 6
computer 14
料金を名前でグループ化し、価格を要約します。翻訳を取得するための複雑なルールがあります。1。デフォルト言語を定義します。この言語がXMLで指定されていない場合は、xslt(開発者が手動で設定)のデフォルト言語を使用します。2.ノードにデフォルト言語の翻訳がない場合は、FallbackLanguage(常にen-us)で翻訳をチェックします。3.以前に翻訳を指定しなかった場合は、翻訳された値を[NONAME]に設定します。
私のアイデアは、翻訳ロジックを別のテンプレートにカプセル化することでした。
<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>