0

私はほぼこの種の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>
4

1 に答える 1

1

これでうまくいくと思います。ぜひお試しください。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="text" />

  <xsl:param name="templateLanguage" select="'ru-ru'" />
  <xsl:param name="fallbackLanguage" select="'en-us'" />

  <xsl:key name="itemName" match="chargeSet" use="chargeName"/>

  <xsl:template match="/">
    <!-- Retrieve chargesForDisplay -->
    <xsl:variable name="chargesForDisplay">
      <xsl:apply-templates select="//charge" mode="buildForDisplay" />
    </xsl:variable>

    <root>
      <xsl:apply-templates select="msxsl:node-set($chargesForDisplay)/*" />
    </root>
  </xsl:template>

  <xsl:template match="text()" />

  <xsl:template
   match="chargeSet[generate-id(.)=generate-id(key('itemName',chargeName)[1])]">
    <xsl:variable name="matchingItems" select="key('itemName', chargeName)" />
    <xsl:value-of 
       select="concat(chargeName, ' ', sum($matchingItems/charge/price), '&#xA;')"/>
  </xsl:template>

  <xsl:template match="charge" mode="buildForDisplay">
    <chargeSet>
      <chargeName>
        <xsl:call-template name="GetLocalizedEntry">
          <!-- Pass in all KeyValuePairs with present, non-blank values-->
          <xsl:with-param name="keyValuePairs" 
             select="name/KeyValuePair[normalize-space(value)]" />
        </xsl:call-template>
      </chargeName>
      <xsl:copy-of select="." />
    </chargeSet>
  </xsl:template>

  <xsl:template name="GetLocalizedEntry">
    <xsl:param name="keyValuePairs" />

    <xsl:variable name="templateLanguageMatch" 
      select="$keyValuePairs[key = $templateLanguage]/value" />
    <xsl:variable name="fallbackLanguageMatch" 
      select="$keyValuePairs[key = $fallbackLanguage]/value" />

    <xsl:choose>
      <xsl:when test="$templateLanguageMatch">
        <xsl:value-of select="$templateLanguageMatch"/>
      </xsl:when>
      <xsl:when test="$fallbackLanguageMatch">
        <xsl:value-of select="$fallbackLanguageMatch"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>[NO NAME]</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

この入力XMLで実行する場合(ルートノードと<charges>サンプルにいくつか追加されたものを含む):

<charges>
  <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>
  <charge>
    <price>8</price>
    <amount>3</amount>
    <name>
      <KeyValuePair>
        <key>ja-jp</key>
        <value>計算機&lt;/value>
      </KeyValuePair>
    </name>
  </charge>
  <charge>
    <price>13</price>
    <amount>3</amount>
    <name>
      <KeyValuePair>
        <key>ru-ru</key>
        <value>shelf</value>
      </KeyValuePair>
    </name>
  </charge>
</charges>

この出力を生成します:

mobile 6
computer 14
[NO NAME] 8
shelf 13
于 2013-01-18T14:27:14.637 に答える