2012-05-05 7 views
1

値がゼロのときに値を更新する必要がある特定の属性(myId)を持つ文書があります。文書は、私は、呼び出し元のプログラムから渡されたユニークなIDに設定するために、属性のMyIDと一致するようにテンプレートを使用していますが、私は唯一の文書の属性のいずれかと一致する場合、このXSLTテンプレートを照合して属性を1回だけ変更する

<?xml version="1.0" encoding="UTF-8"?><Summary> 
<Section myId="0"> 
    <Section myId="0"> 
    <Para>...</Para> 
    </Section> 
    <Section myId="5"> 
    <Para>...</Para> 
    </Section> 
</Section> 
</Summary> 

のように見えます。値が0の追加属性は、別のIDを渡すことによって更新されます。 私のテンプレートは、私はこのようなルックスを使用しています:

<xsl:template  match = '@myId[.="0"]'> 
    <xsl:attribute name = "{name()}"> 
    <xsl:value-of select = "$addValue"/> 
    </xsl:attribute> 
</xsl:template> 

値addValueは、呼び出し元のプログラムから渡されたグローバルパラメータです。 私は今日の良い部分の答えを探しましたが、このテンプレートを1回だけ適用することはできません。出力によって、myIdの値がaddValueの内容に置き換えられます。 私は '@myId [。0 0] [1]'とマッチしようとしましたが、position()関数を使ってマッチさせようとしましたが、テンプレートは常にゼロのすべてのmyId属性に適用されます。

一致するテンプレートは1回だけ適用できますか?

+0

countが0の先行軸を使用してみてください。 –

答えて

1

一致するテンプレートは1回だけ適用できますか?

はい:テンプレートが適用されているかどうか

  1. は、実行のために選択するテンプレートを引き起こしxsl:apply-templatesに依存します。

  2. さらに、一致パターンは、テンプレートがドキュメント内の1つの特定のノードにのみ一致するように指定できます。ここで

あなたが何ができるかです:指名手配、正しい結果が

<Summary> 
    <Section myId="0"> 
     <Section myId="0"> 
      <Para>...</Para> 
     </Section> 
     <Section myId="5"> 
      <Para>...</Para> 
     </Section> 
    </Section> 
</Summary> 

:この変換が提供されるXML文書に適用されると

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pNewIdValue" select="9999"/> 


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

<xsl:template match= 
"Section 
    [@myId = 0 
    and 
    not((preceding::Section | ancestor::Section) 
       [@myId = 0] 
     ) 
    ]/@myId"> 
    <xsl:attribute name="myId"><xsl:value-of select="$pNewIdValue"/></xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

を生産:

<Summary> 
    <Section myId="9999"> 
     <Section myId="0"> 
     <Para>...</Para> 
     </Section> 
     <Section myId="5"> 
     <Para>...</Para> 
     </Section> 
    </Section> 
</Summary> 
+0

'先祖 'に'祖先'が含まれていないのですか、何か不足していますか? –

+0

@torazaburo:いいえ、前後の軸と祖先/子孫の軸は重なっていません。これをW3C XPath Spec http://www.w3.org/TR/xpath/#axesの箇条書き7と8で確認してください。 –

+0

@dimitre:テンプレートマッチングで先行/先祖軸を使用する方法を理解できませんでした属性。多分それは可能ではありませんが、あなたのソリューションは私が必要としていたものとまったく同じです。あなたの助けをありがとう!私はここできちんとしたマッチング技術を学びました。 – VEnglisch

関連する問題