2017-02-12 7 views
0

私はあなたの助けが必要です。私は、XSLTとの闘いだ:私は、例えば、このようなXMLファイルを持っている:XSLTを使ってXMLをaHTML形式に変換する表

<Adresses> 
<Person id="1"> 
    <Name>Bott</Name> 
    <Vorname>Nils</Vorname> 
</Person> 

<Person id="2"> 
    <Name>Hubert</Name> 
    <Vorname>Hubertus</Vorname> 
</Person> 

<Person id="3"> 
    <Name>Large</Name> 
    <Vorname>Lars</Vorname> 
</Person> 

<Numbers> 
    <number> 
    <id>1</id> 
    <tel>12354</tel> 
    </number> 
    <number> 
    <id>3</id> 
    <tel>32354</tel> 
    </number> 
    <number> 
    <id>2</id> 
    <tel>22354</tel> 
    </number> 
</Numbers> 

</Adresses> 

を、私は順番HTMLテーブルに変換する必要があります。 HTML表は、(IDの後に発注を)folowwingのようになります。

<table> 
 
    <tr> 
 
    <th>Name</th> 
 
    <th>Vorname</th> 
 
    <th>Tel</th> 
 
    </tr> 
 
    <tr> 
 
    <th>Bott</th> 
 
    <th>Nils</th> 
 
    <th>12354</th> 
 
    </tr> 
 
</table>

を私の問題は、私がckeckする方法がわからないです。Peron.id = number.id番号を選択してください....誰かが私にこの問題の完全な例を与えることができれば本当に素晴らしいだろう。 Web検索では、チュートリアルではそれほど複雑ではありません;-(....私はXSLTを学んでおり、apply-templates match = "Person"のようないくつかのルールを知っています....しかし、 coorect番号を選択ウィッヒ他のテンプレートを呼び出すための文

私はそれを起動しよう:?

<xsl:template match="/"> 
<html> 
<body> 
<xsl:for-each select="Adresses/Person"> 
    <xsl:call-template name="curPos"> 
    </xsl:call-template> 
    <xsl:value-of select="Name"/> 
    <xsl:value-of select="Vorname"/> 
    </xsl:for-each> 
</body> 
</html> 
</xsl:template> 


<xsl:template name="curPos" match="Person"> 
<xsl:value-of select="position()"/><br> </br> 
</xsl:template> 

答えて

1

私はあなたのために、次のXSLT 2.0ソリューション持っている:今

<xsl:template name="makeTable"> 
    <table> 
    <tr> 
     <th>Name</th> 
     <th>Vorname</th> 
     <th>Tel</th> 
    </tr>   
    <xsl:for-each select="/Adresses/Person"> 
     <tr> 
      <td><xsl:value-of select="Name"/></td> 
      <td><xsl:value-of select="Vorname"/></td> 
      <td><xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/></td> 
     </tr> 
    </xsl:for-each>  
    </table> 
</xsl:template> 

を、私が理解している限り、あなたが持っている問題を理解するためには、selectの正しいXPath式を見つけることです正しい電話番号を入力してください。この場合には切り取ら最も重要なコードは、この行です:XSLT 2.0で

<td> 
    <xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/> 
</td> 

- あなたは、XPathでcurrent()機能付き電流ループ要素を参照することができます - 私は、XSLT 1.0についてはよく分かりません。
idが現在のループ要素属性idに等しいという条件で電話番号Iを選択すると、このノードの子にはtelが実際の番号を取得します。

+0

現在に問題がある場合()では、で変数に値を設定し、 '../Numbers/number[id=$current_id]/tel'で選択することができます。 – Mike

+1

'current()'には問題ありません。 **は**呼び出されていない名前付きテンプレートに問題があります。 –

+0

@ michael.hor257k完全なソースコードを投稿する際に、この部分が質問に非常にうまく答えるときは、一言も書かれていません。 htmlの本文が欠落していることがわかります。 – user1997675

2

私の問題は、私がckeckする方法がわからないです。 Peron.id = number.id番号を選択します....のために正確に何keysあります

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="num" match="number" use="id" /> 

<xsl:template match="/Adresses"> 
    <html> 
     <body> 
      <table> 
       <tr> 
        <th>Name</th> 
        <th>Vorname</th> 
        <th>Tel</th> 
       </tr> 
       <xsl:for-each select="Person"> 
        <tr> 
         <td> 
          <xsl:value-of select="Name"/> 
         </td> 
         <td> 
          <xsl:value-of select="Vorname"/> 
         </td> 
         <td> 
          <xsl:value-of select="key('num', @id)/tel"/> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

表の構造は、それぞれの人が電話番号を1つしか持たないことを前提としています(例のように)。しかし、XMLの構造は、人物と電話番号の間に1対多の関係があることを示唆しているので、あなたは変更を検討する場合があります

<td> 
    <xsl:value-of select="key('num', @id)/tel"/> 
</td> 

へ:

<td> 
    <xsl:for-each select="key('num', @id)"> 
     <xsl:value-of select="tel"/> 
     <br/> 
    </xsl:for-each> 
</td> 
関連する問題