0

次のXMLを、ローカライズできる値(基本的には英語のフレーズ)を除いて同じ要素と属性を持つXMLに変換する必要があります。

一部の要素(<footnote>)と属性はオプション(<display_data_type>)であり、各要素のテンプレートがなくても、これを一般的に実行できるようにしたいと思います。それは可能ですか?

最終的な目標は、ローカライズされた文字列を無視して、XMLのデフォルトバージョンをローカライズされたバージョンと比較できるようにすることです。

たとえば、次のとおりです。

<data_schema>
    <field symbol="ACCOUNT" type="string" name="Account Number">
        <validators>
            <maxlength>6</maxlength>
        </validators>
        <description>The account number</description>
        <example>123456</example>
        <default_value></default_value>
    </field>
    <field symbol="POSTAL_CODE" type="string" name="Postal Code">
        <description>Postal Code for account</description>
        <example>22022</example>
        <footnote>Does not apply to certain accounts</footnote>
        <default_value></default_value>
    </field>
    <field symbol="DISCOUNT" type="string" name="Discount Percentage" display_data_type="percentage">
        <description>Descount determined by account</description>
        <example>1.5%</example>
        <default_value></default_value>
    </field>
</data_schema>

次のように変換されます:

<data_schema>
    <field symbol="ACCOUNT" type="string" name="">
        <validators>
            <maxlength>6</maxlength>
        </validators>
        <description/>
        <example/>
        <default_value/>
    </field>
    <field symbol="POSTAL_CODE" type="string" name="">
        <description/>
        <example/>
        <footnote/>
        <default_value/>
    </field>
    <field symbol="DISCOUNT" type="string" name="" display_data_type="percentage">
        <description/>
        <example/>
        <default_value/>
    </field>
</data_schema>
4

2 に答える 2

4

別のアプローチがあります。これは、基本的にすべてのノードをそのままコピーする「IdentityTransform」のXSLTデザインパターンに基づいています。

<xsl:template match="@*|node()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

これを拡張して、特定のアクションを実行するノードに一致する他のテンプレート一致を追加します。この場合、テキストを削除します。必要なテンプレートは、変換の正確なルールによって異なります。

特定の要素と属性からテキストを削除したい場合は、次の2つのテンプレートを追加して、ノードをコピーしますが、テキストはありません。

<xsl:template match="description|example|footnote|default_value">
   <xsl:copy/>
</xsl:template>

<xsl:template match="@name">
   <xsl:attribute name="{name()}"/>
</xsl:template>

したがって、この場合、要素の説明脚注、およびdefault_valueのテキストは、@ name属性とともに削除されます。他のすべてのノードは、テキストとともにそのままコピーされます。

一方、変更したくない要素と属性の特定のリストがある場合は、次のようなテンプレートを追加できます。

<xsl:template match="field/*[not(self::validators)]">
   <xsl:copy/>
</xsl:template>

<xsl:template match="@symbol|@type|@display_data_type">
   <xsl:copy/>
</xsl:template>

<xsl:template match="@*">
   <xsl:attribute name="{name()}"/>
</xsl:template>

したがって、バリデーター要素については、実際には、バリデーター要素ではないものをすべて削除すると言っています。バリデーター要素は、ID変換テンプレートによってコピーされます。属性については、保持する属性が明示的にリストされているわずかに異なるアプローチを示しました。他のすべてのテキストからテキストを削除するための2番目のテンプレートがあります。

この場合の2つの完全なXSLTは次のとおりです。

特定のノードからテキストを削除するための最初の

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="description|example|footnote|default_value">
      <xsl:copy/>
   </xsl:template>

   <xsl:template match="@name">
      <xsl:attribute name="{name()}"/>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

特定のノードにテキストを保持するための2番目

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="field/*[not(self::validators)]">
      <xsl:copy/>
   </xsl:template>

   <xsl:template match="@symbol|@type|@display_data_type">
      <xsl:copy/>
   </xsl:template>

   <xsl:template match="@*">
      <xsl:attribute name="{name()}"/>
   </xsl:template>

   <xsl:template match="node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

サンプルドキュメントの場合、どちらも同じ出力を生成するはずです。

<data_schema>
   <field symbol="ACCOUNT" type="string" name="">
      <validators>
         <maxlength>6</maxlength>
      </validators>
      <description/>
      <example/>
      <default_value/>
   </field>
   <field symbol="POSTAL_CODE" type="string" name="">
      <description/>
      <example/>
      <footnote/>
      <default_value/>
   </field>
   <field symbol="DISCOUNT" type="string" name="" display_data_type="percentage">
      <description/>
      <example/>
      <default_value/>
   </field>
</data_schema>
于 2012-09-08T08:13:44.973 に答える
1

これが例です。このようなテンプレートを適用すると、ツリーのコピーから、シンボルまたはタイプではない属性のテキスト領域と属性テキストを除いたものが作成されます。

<xsl:template match="*">
  <xsl:element name="{name()}">
    <xsl:for-each select="@*">
      <xsl:choose>
        <xsl:when test="name() = 'symbol' or name() = 'type'">
          <xsl:copy-of select="."/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:attribute name="{name()}"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>  

    <xsl:apply-templates select="*"/>
  </xsl:element>
</xsl:template>
于 2012-09-07T23:21:30.370 に答える