※ ChatGPTを利用し、要約された質問です(原文:XSLTで、あるノードの Text を別なノードの Name として参照)
XSLTでノードのTextを別ノードのNameとして参照する方法
このQ&Aのポイント
XSLTで特定のノードのTextを別のノードのNameとして参照する方法について説明します。
変換したいXML文書の最初のトップレベルノードの階層をたどって、特定のTextに一致するNameのノードを次のトップレベルノードの階層で参照することができます。
具体的なXML文書とXSL文書の例を示し、実際に適用するための手順を解説します。
XSLTで、あるノードの Text を別なノードの Name として参照
変換したいXML文書の最初のトップレベルノードの階層をたどって text を拾っていくと、その text に一致する name のノードが次のトップレベルノードの階層で、出現するようになっています。
そこで、まず、最初のノードの階層をたどっていって、その順序で、2番目のノードから値を引いてきて表示させたいのです。
■変換したい XML 文書 DataDocument.xml
<datadocument>
<setteischema>
<sitem>solution
<scategory>solution1</scategory>
</sitem>
<sitem>itsales
<scategory>itsales1</scategory>
</sitem>
</setteischema>
<setteivalue>
<solution>
<solution1>ソリューション1</solution1>
</solution>
<itsales>
<itsales1>ITセールス1</itsales1>
</itsales>
</setteivalue>
</datadocument>
それに対して、適用したい XSL は次のようなものです。
■変換命令を記述したXSL文書 StyleDocument.xsl
<xsl:template match="setteischema" >
<xsl:for-each select="*">
<xsl:variable name="foo" select="text()"/>
<xsl:for-each select="*">
<xsl:variable name="bar" select="text()"/>
<xsl:value-of select="★1" />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
実際は★1の部分で setteivalue/$foo/$var といったパスで得られるノードのテキストを表示させたいのです。
どうしたらできますか?
よろしくお願いします。
お礼
なるほど、わかりました。 *[name()=$foo] のパターンがつかえるわけですね。 これでやってみます。normalize-space は必要でした。 ありがとうございました。