2016-12-15 22 views
0

HTMLファイルから特定の順序でテキストを書きたいので、ノードの内容を特定の順序で出力するテンプレートを使用します。 これはXSLです:xslt:最初のノードのみが選択されています

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

    <xsl:output method="text" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> 

    <xsl:template match="div[@class='this']"> 
     <xsl:text>B=</xsl:text><xsl:value-of select="div[@class='b']" /> 
     <xsl:text>, A=</xsl:text><xsl:value-of select="div[@class='a']" /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

これはHTMLです:

<html> 
    <body> 
     <div class="this"> 
<div> 
    <div> <!-- This div make the xsl fail --> 
     <div class="a">Second Class A</div> 
     <div class="b">Second Class B</div> 
     </div> 
    </div> 
     <div class="this"> 
     <div class="b">First Class B</div> 
     <div class="a">First Class A</div> 
     </div> 
    </body> 
</html> 

それが原因で余分なdiv要素の最初のノードを選択するために失敗します。

B=, A= 
B=First Class B, A=First Class A 

任意の提案ですか?

よろしくお願いします。Peter

+0

.//select="div[@class='b '] "任意の数のタグで機能しました。 – Peter

答えて

1

あなたは正しいです。 //を使用すると、ドキュメントのルートから開始します。解決策はこれを単に削除することであり、表現はあなたの現在のノードに対する相対的なものです。

<xsl:template match="div[@class='this']"> 
     <xsl:text>B=</xsl:text><xsl:value-of select="div[@class='b']" /> 
     <xsl:text>, A=</xsl:text><xsl:value-of select="div[@class='a']" /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

ドットでつなげることができます。その場合、次のようになります。

<xsl:value-of select="./div[@class='b']" /> 
関連する問題