@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

[xslt]文字列を使った条件分岐

1
投稿者投稿内容
すみれ
会議室デビュー日: 2005/07/12
投稿数: 13
投稿日時: 2009-04-03 15:08
いつもお世話になっております。
すみれと申します。
以下のようなxml文書Aがあり、Bのように結果を出したいのですが、
when以下の処理でつまづいてしまっています。
(コンテキストノードをつかめていません。。)
どなたかお力を貸していただけないでしょうか。
よろしくお願いいたします。

■xmlA
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<配列>"1, 3"</配列>
<数>4</数>
<li id="1">a</li>
<li id="2">b</li>
<li id="3">c</li>
</doc>

■結果B
<?xml version="1.0" encoding="UTF-8"?>
<p>
<span class="highlight">a</span>
</p>
<p>
<span>b</span>
</p>
<p>
<span class="highlight">c</span>
</p>

■未完成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="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<xsl:apply-templates select="doc"/>
	</xsl:template>

	<xsl:template match="doc">
		<xsl:param name="str" select="配列"/>
		<xsl:for-each select="li">
			<xsl:variable name="id" select="@id"/>
			<xsl:choose>
				<xsl:when test="starts-with(/doc/配列, '&quot;$id, ')">
					<xsl:call-template name="highlight"/>
				</xsl:when>
				<xsl:when test="contains(/doc/配列, ', $id&quot;')">
					<xsl:call-template name="highlight"/>
				</xsl:when>
				<xsl:otherwise>
					<p><span><xsl:value-of select="."/></span></p>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:for-each>
	</xsl:template>
	
	<xsl:template name="highlight">
		<p><span class="highlight"><xsl:value-of select="."/></span></p>
	</xsl:template>
</xsl:stylesheet>

nadera
会議室デビュー日: 2009/04/04
投稿数: 1
投稿日時: 2009-04-04 00:42
とりあえず,比較する文字列をconcatを使って生成すると,
一応,目的の出力になると思います。

<xsl:when test="starts-with(/doc/配列, '"$id, ')">
 ↓
<xsl:when test="starts-with(/doc/配列, concat('"',$id,','))">

<xsl:when test="contains(/doc/配列, ', $id"')">
 ↓
<xsl:when test="contains(/doc/配列, concat(',',$id,'"'))">

なお,highlightにするかどうかの属性を付け加えると,
xslは簡単になりますね。
 <li id="1" hg="1">a</li>
 <li id="2" hg="0">b</li>

すみれ
会議室デビュー日: 2005/07/12
投稿数: 13
投稿日時: 2009-04-09 10:49
naderaさん

書き込みをありがとうございます!
書き込みいただいたxsltで試してみたのですが、残念ながらうまくいきませんでした。
また元のソースに属性を加えられたら解決するのですが、それができない状況です。。
text()を使ったり等、引き続きチャレンジしてみます!
すみれ
会議室デビュー日: 2005/07/12
投稿数: 13
投稿日時: 2009-04-09 14:29
解決いたしました。
docテンプレートを修正して、処理用テンプレートを追加しました。
ありがとうございました。

1.docテンプレートからcall-templateで処理用のテンプレートを呼び出す。
2.concatでid属性と文字列をつなげる。
3.条件と一致したら、highlightの処理をさせる。

コード:
<xsl:template match="doc">

<xsl:param name="str" select="配列"/>
<xsl:for-each select="li">
<xsl:call-template name="check">
<xsl:with-param name="checkid" select="@id"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

<xsl:template name="check">
<xsl:param name="checkid"/>
<xsl:choose>
<xsl:when test="//配列[contains(text(), concat('"', $checkid, ','))]">
<xsl:call-template name="highlight"/>
</xsl:when>
<xsl:when test="//配列[contains(text(), concat(' ', $checkid, ','))]">
<xsl:call-template name="highlight"/>
</xsl:when>
<xsl:when test="//配列[contains(text(), concat(' ', $checkid, '"'))]">
<xsl:call-template name="highlight"/>
</xsl:when>
<xsl:otherwise>
<p><xsl:value-of select="."/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>




[ メッセージ編集済み 編集者: すみれ 編集日時 2009-04-09 14:31 ]
1

スキルアップ/キャリアアップ(JOB@IT)