xpathを動的に作成してxmlノードの属性の値を取得しようとしています。しかし、常に空の値を返しています。私がxpathをハードコードすると、うまく動作します。以下のサンプルXMLファイルです:入力から目的のIDを読み取るxpathを使用してノードを取得できません
<root>
<PR id="id6016" name="OUTER WORLD">
<ADS id="id6017" dsRef="#id15" role="form1">
</ADS>
<ADS id="id6018" dsRef="#id9" role="form1">
</ADS>
</PR>
<PR id="id1000" name="OUTER WORLD">
<ADS id="id1001" dsRef="#id16" role="form1">
</ADS>
<ADS id="id1002" dsRef="#id10" role="form1">
</ADS>
</PR>
<DS id="id9" name="form1" version="7" type="CAD">
</DS>
<DS id="id15" name="form1" version="1" type="MSWord">
</DS>
<DS id="id10" name="form1" version="1" type="CAD">
</DS>
<DS id="id16" name="form1" version="1" type="MSWord">
</DS>
</root>
マイサンプルXSLは次のとおりです。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" indent="no" encoding="utf-8"/>
<xsl:template match="/root">
<result>
<xsl:apply-templates select="PR" mode="PR" />
</result>
</xsl:template>
<xsl:template match="PR" mode="PR">
<PR>
<xsl:attribute name="id">
<xsl:value-of select="@id" />
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="@name" />
</xsl:attribute>
<xsl:for-each select="ADS[@role='form1']">
<DS>
<xsl:attribute name="id">
<xsl:value-of select="string(substring-after(@dsRef, '#'))" />
</xsl:attribute>
<xsl:value-of select="../DS[@id=string(substring-after(@dsRef, '#'))]/@type" />
</DS>
</xsl:for-each>
<DS2>
<xsl:value-of select="../DS[@id='id9']/@type" />
</DS2>
<DS3>
<xsl:value-of select="../DS[@id=string(substring-after(@dsRef, '#'))]/@type" />
</DS3>
</PR>
</xsl:template>
</xsl:stylesheet>
あなたは私がDS2タグのためではなく、DSやDS3のための任意のInnerTextプロパティを取得見ることができるように。私はまた、私が得ているIDが良いことを示すために、DSタグにid属性を追加しました。
最終的には、type = "CAD"のIDタグをフィルタして変数に格納する必要がありますが、今はxpathを使用してXMLノードを取得できないため、スタックされています。私が正しくあなたの問題のあなたの説明を理解している場合は
あなたの説明に感謝します。私は現在の()関数を使用していないが、私はより頻繁に私のコードでそれを使用して調べます。上記で共有したxmlはスニペットに過ぎません。残念ながら元のxmlにはIDを定義するDTDが含まれていません。私はxpathでid9をハードコードするときにtype属性の値を取得しますが、変数を使用するときは取得しません。 – DS1
2つのデバッグ要素DS2とDS3はfor-eachの外側にあります。コンテキストノードはADSではなくPRです。それぞれをfor-eachに移動すると、コンテキストノードがADS要素なので、両方が失敗することがわかります。 –