У меня есть примерно такой 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? Я полагаю, что не будет проблем с 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>
en-us
Очень приблизительно: я хочу, чтобы мой рендеринг xslt преобразовал его следующим образом:
mobile 6
computer 14
Он группирует сборы по названию и суммирует цены. У нас есть сложные правила для получения перевода: 1. Мы определяем язык по умолчанию - если у нас нет этого языка, указанного в XML, мы берем язык по умолчанию для xslt (задается разработчиком вручную). 2. Если узел не имеет перевода для языка по умолчанию, мы проверяем наличие перевода на FallbackLanguage (всегда 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>
node-set()
. Кроме того, необходимо ли передаватьContainerPath
в качестве параметра? Оценка XPath из строкового значения не предусмотрена в большинстве (любых?) реализаций XSLT 1.0. - person JLRishe   schedule 18.01.2013<xsl:value-of>
в одном месте, где вам нужно было<xsl:copy-of>
. - person JLRishe   schedule 18.01.2013