2012-04-30 23 views
1
<a id='a1' name='a1'/> 
<b text='b1'/> 
<d test='test0' location='L0' text='c0'/> 
<a id='a2' name='a2'/> 
<b text='b2'/> 
<c test='test1' location='L1' text='c1'/> 
<c test='test2' location='L2' text='c2'/> 
<a id='a3' name='a3'> 
<b text='b3'/> 
<c test='test3' location='L3' text='c3'/> 
<c test='test4' location='L4' text='c4'/> 
<c test='test5' location='L5' text='c5'/> 

これらの要素はすべてsiblings.someですが、何の<c>要素を持っていないときに、私はこれらのelements.forこのように何もしません、1つのまたは2つ以上の<c>の要素を持っています、私は、各<a> element.iは、このようなテンプレートを適用するために一度だけa/@nameを表示したいが、それは私がこの要素の兄弟表示され、要素の表示属性値

のような出力をしたい

<xsl:template match="a"> 
<xsl:choose> 
    <xsl:when test="following-sibling::c[1]"> 
     <p> 
      <u>           
      <xsl:value-of select="(preceding-sibling::a[1])/@name"/> 
      </u> 
     </p>       
    </xsl:when> 
    <xsl:otherwise> 
    </xsl:otherwise> 
</xsl:choose> 

を動作しません。いずれかが発生した場合、あなたのXSLTを見ていると期待される結果から、10

+0

こんにちは!あなたのXML入力サンプルは整形式ではないので整理してください。一部のタグは閉じられておらず、ルート要素はありません。ありがとう! –

答えて

0

が、それはあなたのXMLの各要素のそれのように見える、あなたは、現在、以下のC要素の出力INFOMATIONしたい次前要素が存在する。最初を先行することによって要素に

<xsl:key name="lookup" match="c" use="generate-id(preceding-sibling::a[1])" /> 

すなわちグループ一緒にすべてのC要素を与えためC要素をルックアップするためのキー

はこのためには、XSLを使用することができます要素。

その後、あなたはまず要素がいるC要素そうのような存在を選択することができます。

<xsl:apply-templates select="a[key('lookup', generate-id())]" /> 

その後、このテンプレートの中、あなたは出力用CCの要素を選択することができ、そのような次のXSLT

与えそう

<xsl:apply-templates select="key('lookup', generate-id())" /> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:key name="lookup" match="c" use="generate-id(preceding-sibling::a[1])" /> 

    <xsl:template match="/root"> 
     <xsl:apply-templates select="a[key('lookup', generate-id())]" /> 
    </xsl:template> 

    <xsl:template match="a"> 
     <xsl:value-of select="concat(@id, ':&#13;', '&#13;')" /> 
     <xsl:apply-templates select="key('lookup', generate-id())" /> 
    </xsl:template> 

    <xsl:template match="c"> 
     <xsl:apply-templates select="@*" /> 
     <xsl:value-of select="'&#13;'" /> 
    </xsl:template> 

    <xsl:template match="c/@*"> 
     <xsl:value-of select="concat(local-name(), ':', ., ':&#13;')" /> 
    </xsl:template> 
</xsl:stylesheet> 

次のXML

<root> 
    <a id="a1" name="a1"/> 
    <b text="b1"/> 
    <d test="test0" location="L0" text="c0"/> 
    <a id="a2" name="a2"/> 
    <b text="b2"/> 
    <c test="test1" location="L1" text="c1"/> 
    <c test="test2" location="L2" text="c2"/> 
    <a id="a3" name="a3"/> 
    <b text="b3"/> 
    <c test="test3" location="L3" text="c3"/> 
    <c test="test4" location="L4" text="c4"/> 
    <c test="test5" location="L5" text="c5"/> 
</root> 

に適用すると、次の私は、彼らがXMLに表示されている順序でC要素の属性を出力しています出力

a2: 

test:test1: 
location:L1: 
text:c1: 

test:test2: 
location:L2: 
text:c2: 

a3: 

test:test3: 
location:L3: 
text:c3: 

test:test4: 
location:L4: 
text:c4: 

test:test5: 
location:L5: 
text:c5: 

注意です資料。

+0

あなたはそのような知識をどこで得ることができるのか教えていただけますか?本当にあなたにもう一度お気遣いしたくありません –

+0

http://stackoverflow.com/questions/3442827/good-books-on-xsltチュートリアル、XSLTに関する本 –

+0

なぜgenerate-id(先行兄弟:: a [1]は生成名ではありません(先行兄弟:: a [1] –

関連する問題