2

ソース XML 内の存在しない属性 (または要素) にアクセスしようとすると、XSLT がエラーをスローするようにする簡単な方法を探しています。現在、属性が存在するかどうかを最初に確認し、存在しない場合は手動でエラーをスローします-例:

<xsl:if test="not(attribute_to_use)">

 <xsl:message terminate="yes">

  <xsl:text>error message</xsl:text>                    

 </xsl:message>

</xsl:if>

<!-- do something -->

<xsl:attribute name="new_attribute"><xsl:value-of select="attribute_to_use" /></xsl:attribute>

特にすべての属性に対してこれを行う場合、属性をチェックするコードがたくさんあることがわかりました。XSLT 内でこれを行う他の方法はありますか?たとえば、「存在しない属性で中止する」などのディレクティブを設定することでしょうか?

これを行う 1 つの方法は、DTD またはスキーマを使用することであることも知っています。直接的な XSLT の方法がない場合は、この方法で行います。

どうもありがとう!

4

2 に答える 2

2

XPath 2.0 では、ノード $N を使用し、それが存在しない場合に失敗するときはいつでも、関数呼び出しで $N への参照を正確に 1 つ ($N) または 1 つ以上 ($N) ラップするだけです。 .

于 2013-02-28T14:45:56.143 に答える
2

ご存じのとおり、XSLT 1.0 はノードに一致するテンプレートに基づいているため、特定の属性を持たないすべての要素に一致するテンプレートを作成できます。

たとえば、次のテンプレートは @id 属性を持たないなどのすべての要素に一致します。

<xsl:template match="*[not(@id)]">
    <xsl:message terminate="yes">
        <xsl:value-of select="concat('Attribute @id does not exist in element ', name())" />
    </xsl:message>
</xsl:template>

したがって、特定の要素に特定の属性を持たせたい場合は、次のような一致式を使用できます: Element[not(@id)]|Element2[not(@a)] など。そして、それぞれに異なるテンプレートを記述します。これらの属性がある場合にそれらを処理するための要素:

<xsl:template match="Element[not(@id)]|Element2[not(@a)]">
     <!-- Throw error message -->
</xsl:template>

<xsl:template match="Element">
     <!-- Process Elements which have an @id attribute -->
</xsl:template>

<xsl:template match="Element2">
     <!-- Process Elements which have an @a attribute -->
</xsl:template>

特定の要素に「属性を持つ」、「属性の値が無効である」、「子の数が 5 である」などの特定のプロパティがある場合にエラーをスローするために、必要なだけ複雑なテンプレートを作成することができます (それほど複雑ではないはずです)。 」など

あなたが達成しようとしていることを一般的な方法で実装する方法のアイデアをあなたに与えてくれることを願っています.

于 2013-02-28T10:56:49.020 に答える