2017-05-28 2 views
-1

xsltの構文が間違っていると教えてください。XSLTを使用すると関数が動作しませんが、xpath式が良いです

は、私はすでに私のXPath式ベローズが良好であることを確認し、正しい結果を返す:得るために機能「が含まれている」と今

/*[local-name()='animal']/*[local-name()='birth']/*[local-name()='date'] 

を、私はXSLTに再使用この表現しようとしています真か偽かは分かりませんが、うまくいかないのです。私は間違って何かをしなければならない。

私はこれを試してみました:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output 
    method="html" 
    encoding="UTF-8" 
    doctype-public="-//W3C//DTD HTML 4.01//EN" 
    doctype-system="http://www.w3.org/TR/html4/strict.dtd" 
    indent="yes" ></xsl:output> 

<xsl:template match="/"> 
<html> 
    <head> 
    <title>Test </title> 
</head> 
<body> 

    <p> Birth date 1998-08-20 (true/false) : </p> 
    <xsl:apply-templates select="/*[local-name()='animal']/*[local-name()='birth']"/> 

</body> 
</html>   
</xsl:template> 

    <xsl:template match="/*[local-name()='birth']"> 
    <xsl:value-of select="contains(/*[local-name()='date'], '1998-08-20')"> </xsl:value-of> 
    </xsl:template> 


</xsl:stylesheet> 

誰かが私が間違っているのを教えていただけますか?

ありがとうございました! :-)))

+0

はどのようにあなたのコードが動作していないとき、あなたのXPathが良好であることを主張することができ、そしてどのようにあなたが入力XML文書を示していないとき、私たちはあなたを助けるために期待できますか?問題を示す[mcve]を入力してください。ありがとう。 – kjhughes

答えて

1

あなたのXMLを見ることなく、私たちは推測できます。

/*[local-name()='animal']/*[local-name()='birth']/*[local-name()='date'] 

作品、そしてあなたのルート要素の名前がanimalでなければなりません:私は、この場合のことを言うでしょう。したがって、これは:ルート要素の名前がbirthではないので

/*[local-name()='birth'] 

、動作しないことができる(整形式のXMLは、1つのルート要素のみを持っています)。

-
P.S. *[local-name()='xyz']のようなハッキングを使用する必要はありません。接頭辞を使用して名前空間を処理する方法を学びます。

0

スラッシュが多すぎます。 XPathでは、式を/で開始すると、ツリーの最上部、ルートノードにジャンプします。

あなたのテンプレート一致式は、birth要素(スラッシュなし)と一致する必要があります。そのテンプレートの内部では、コンテキストノードはbirthの要素なので、の式はdate要素の前にスラッシュを付けるべきではありません。スラッシュのないXPath文は、コンテキストノードから相対的な子を選択します。

<xsl:template match="*[local-name()='birth']"> 
    <xsl:value-of select="contains(*[local-name()='date'], '1998-08-20')"/> 
</xsl:template> 
関連する問題