2

xsltを使用して属性値を持つノードが存在するかどうかを確認する方法は?

私のxmlがこのようになったら

<root>
 <sub>
    <p>text</p>
   <title id='id1-num-444'>text</title>
    <p>text</p>  
   <title id='id1-str-aaa'>text</title>
    <p>text</p>  
   <title id='id1-num-333'>text</title> 
    <p>text</p>  
 </sub>
</root>

私は次のxslを使用しました

<xsl:template match ="sub">

  ....some tags...

  <xsl:if test ="contains(name(), 'title[@id='id1-num']')">
  <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>
</xsl:template>

if条件がnumまでチェックする必要がある場合、num以降は何も考慮されません。ありがとう。

4

3 に答える 3

2

より短く、より正確な解決策は、標準のXPath関数を使用することですstarts-with()

starts-with(@id, 'id1-num')

したがって、コードフラグメントは次のようになります。

<xsl:if test="starts-with(@id, 'id1-num')">
   <xsl:call-template name ="title"/>
</xsl:if>
于 2012-07-06T12:53:38.303 に答える
1

属性値の一部をテストする場合は、を使用する必要がありますcontains()が、もちろん、実際の方法とは異なります。

ショーン・ダーキンが言ったように、あなたの焦点が候補のタイトル要素にあると仮定すると、

<xsl:if test ="contains(self::title/@id,'id1-num')">
    <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

または少し明確ではありません

<xsl:if test ="contains(@id,'id1-num')">
    <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

トリックを行います。

于 2012-07-06T11:44:15.463 に答える
0

必要なものを理解するにはもう少しコンテキストが必要ですが、おそらくそのようなテンプレートルールに一致させたいですか?..。

<xsl:template match="title[@id='id1-num']">
  ... contents go here ...
</xsl:template>

シーケンスコンストラクター内のテストである必要があり、フォーカスアイテムが候補のタイトル要素である場合、おそらく?..。

<xsl:if test ="self::title[@id='id1-num']">
  <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

上記で、テストは次の場合にのみ合格します。

  1. フォーカスアイテムは、titleという名前の要素です。
  2. 値が「id1-num」の属性IDがあります
于 2012-07-06T09:41:45.860 に答える