web-dev-qa-db-ja.com

XSLT:タグが存在する場合は、テンプレートを適用します。そうでない場合は、静的な値を選択します

私は一般的にXSLTを初めて使用するので、我慢してください...

それを念頭に置いて、私がやろうとしているのは、XML内の特定のタグをチェックすることです。そこにある場合は、テンプレートを適用したいと思います。そうでない場合は、(空白の値として)追加します。基本的に、常に最終出力に強制します。どうすればいいですか?

私はこのようなものを持っていました...

_<xsl:choose>
    <xsl:when test="@href">
        <xsl:apply-templates select="country" />
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
</xsl:choose>
_

コードの一番上の部分は、私が間違っていると思うものです。 otherwiseタグに何かが必要で、whenの部分が間違っていると思います。

_<xsl:template match="country">
    <xsl:if test=". != '' or count(./@*) != 0">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>
_

誰か助けてもらえますか?前もって感謝します。

編集:

はい、結局、少なくとも_<country />_タグをXMLに含める必要があります。しかし、存在しない可能性もありますまったく。存在しない場合は、入力する必要があります。適切な入力の例は、_<country>US</country>_です。

13
Issa Fram

親要素のテンプレートでは、country要素が使用されていると予想されます。

<xsl:template match="foo">
  <xsl:if test="not(country)">
    <country>US</country>
  </xsl:if>
  <xsl:apply-templates/>
</xsl:template>

fooの代わりに、親要素の名前を使用します。そしてもちろん、要素のコピーのような他のこともできます。私はifチェックに焦点を合わせました。私の見解では、実際にxsl:choose/when/otherwiseは必要ありません。apply-templatesは存在しない子要素に対しては何もしないため、xsl:ifで十分です。

12
Martin Honnen

さらに簡単

<xsl:template match="foo[not(country)]">
        <country>US</country>
    <xsl:apply-templates/>
</xsl:template>

注意

XSLT条件付き命令なし<xsl:if>など)使用そしてそれらは必要ありません。

多くの場合、<xsl:if>または<xsl:choose>の存在は、特に条件付き命令を取り除くことによって、コードをリファクタリングし、大幅に改善できることを示しています。

12

条件付き処理 も必要ありません。このスタイルシート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="item[not(country)]">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
            <country>Lilliput</country>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

この入力で:

<root>
    <item>
        <country>Brobdingnag</country>
    </item>
    <item>
        <test/>
    </item>
</root>

出力:

<root>
    <item>
        <country>Brobdingnag</country>
    </item>
    <item>
        <test></test>
        <country>Lilliput</country>
    </item>
</root>
6
user357812