0

次のような入力があるとしましょう。

<country>
    <name>countryname</name>
    <capital>captialname</capital>
    <population>19000</population>
</country>

xslを使用して上位コードを言うことができるように、要素名を変換しています。国の子要素が発生しない場合があります。したがって、次のように変換を記述できます。

<xsl:template match="country">
    <xsl:element name="COUNTRY">
        <xsl:apply-templates select="name" />
        <xsl:apply-templates select="capital" />
        <xsl:apply-templates select="population" />
    </xsl:element>
</xsl:template>

<xsl:template match="name">
    <xsl:element name="NAME">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="capital">
    <xsl:element name="CAPITAL">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="population">
    <xsl:element name="POPULATION">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

または私は次のようにそれを行うことができます。

<xsl:template match="country">
<xsl:element name="COUNTRY">
    <xsl:if test="name">
        <xsl:element name="NAME">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
    <xsl:if test="capital">
        <xsl:element name="CAPITAL">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
    <xsl:if test="population">
        <xsl:element name="POPULATION">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
</xsl:element>

どちらの方法でメモリの使用量が少なくなるのだろうと思っています。私が持っている実際のコードは、テンプレート内の 7 レベルの深さにあります。したがって、私が知る必要があるのは、単純な要素にテンプレートを使用しないと、メモリ使用量が改善されるということです。

4

2 に答える 2

1

私の理解では、最初のものは良いです。変更するだけです:

<xsl:apply-templates select="name" />
        <xsl:apply-templates select="capital" />
        <xsl:apply-templates select="population" />

<xsl:apply-templates/>

子要素が来ない場合でも心配する必要はありません.XSLTがそれを処理することがあります.

于 2013-04-19T11:56:49.717 に答える
0

間違った方向からアプローチしていると思います。現在の XSLT テンプレートはあまり柔軟ではありません。新しい要素が追加された場合は、常に修正する必要があります。

代わりに、恒等変換を使用し、任意の汎用要素に一致するテンプレートを含めて、名前を大文字で出力する必要があります。

このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="*">
    <xsl:element name="{upper-case(local-name())}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

次のテンプレートはすべての要素に一致し、名前を大文字に変換することに注意してください

<xsl:template match="*">

他のテンプレートの一致は、属性または要素以外の他のノードと一致し、それらをそのままコピーするだけです

<xsl:template match="@*|node()[not(self::*)]">

XML に名前空間が定義されている場合、このソリューションは機能しないことに注意してください。

于 2013-04-19T12:41:31.497 に答える