私は一般的に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>
_です。
親要素のテンプレートでは、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
で十分です。
さらに簡単:
<xsl:template match="foo[not(country)]">
<country>US</country>
<xsl:apply-templates/>
</xsl:template>
注意:
XSLT条件付き命令なし(<xsl:if>
など)使用そしてそれらは必要ありません。
多くの場合、<xsl:if>
または<xsl:choose>
の存在は、特に条件付き命令を取り除くことによって、コードをリファクタリングし、大幅に改善できることを示しています。
条件付き処理 も必要ありません。このスタイルシート:
<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>