電子書籍の厳選無料作品が豊富!

xslで質問させてください。
以下のようなxmlとxslを作っているのですが、xslの最後のほうで、
sample.xmlの/empList/emp/type/@idの値に応じて、typeList.xmlの/typeList/type/titleの値を取得したくて、

xsl:value-of select="document('typeList.xml')/typeList/type[@id = type/@id]/title/text()" />

と書いていますが、うまくいきません。どうすればいいでしょうか?


-----[sample.xml]
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="a.xsl" type="text/xsl"?>
<empList>
<emp>
<type id="1" />
<name>鈴木</name>
<desc>あああ</desc>
</emp>
<emp>
<type id="2" />
<name>田中</name>
<desc>いいい</desc>
</emp>
</empList>

-----[typeList.xml]
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="a.xsl" type="text/xsl"?>
<typeList>
<type id="1">
<title>タイプ1</title>
</type>
<type id="2">
<title>タイプ2</title>
</type>
</typeList>


-----[a.xsl]
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output
method="html"
encoding="UTF-8"
omit-xml-declaration="yes"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
media-type="text/html"
/>

<xsl:template match="/">
<html>
<head><title>サンプル</title></head>
<body>
<xsl:apply-templates select="empList/emp" />
</body>
</html>
</xsl:template>

<xsl:template match="emp">
<h2><xsl:value-of select="name/text()" /></h2>
<p>タイプ:<xsl:value-of select="document('typeList.xml')/typeList/type[@id = type/@id]/title/text()" /></p>
<p>メモ:<xsl:value-of select="desc/text()" /></p>
</xsl:template>
</xsl:stylesheet>

A 回答 (1件)

Q3207219-1.xml




<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="Q3207219-3.xsl" type="text/xsl"?>
<empList>
<emp>
<type id="1" />
<name>鈴木</name>
<desc>あああ</desc>
</emp>
<emp>
<type id="4" />
<name>田中</name>
<desc>いいい</desc>
</emp>
<emp>
<type id="2" />
<name>田中</name>
<desc>いいい</desc>
</emp>

<emp>
<type id="3" />
<name>田中</name>
<desc>いいい</desc>
</emp>
</empList>

Q3207219-2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
スタイルシートここはいらないだろう
<?xml-stylesheet href="a.xsl" type="text/xsl"?>

-->
<typeList>
<type id="2">
<title>タイプ2</title>
</type>
<type id="1">
<title>タイプ1</title>
</type>
<type id="3">
<title>猪突猛進タイプ</title>
</type>
<type id="4">
<title>遠隔操作タイプ</title>
</type>
</typeList>

Q3207219-3.xsl

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output
method="html"
encoding="UTF-8"
omit-xml-declaration="yes"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
media-type="text/html"
/>

<xsl:template match="/">
<html>
<head><title>サンプル</title></head>
<body>
<xsl:apply-templates select="empList/emp" />
</body>
</html>
</xsl:template>

<xsl:template match="emp">
<h2><xsl:value-of select="name/text()" /></h2>
<p>タイプ:
<xsl:call-template name="hoge"><xsl:with-param name="Id" select="type/@id" />
<xsl:with-param name="Id2" select="document('Q3207219-2.xml')/typeList" />
</xsl:call-template>
</p>
<p>メモ:<xsl:value-of select="desc/text()" /></p>
</xsl:template>

<xsl:template name="hoge">
<xsl:param name="Id" />
<xsl:param name="Id2" />
<xsl:for-each select="$Id2/type">
<xsl:if test="$Id = @id">
<xsl:value-of select="title" />
</xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>


【後記】
手元のeXtyleとMinefieldで一応きちんと確認しているが,
正直自信がない。

俺は,XSLTを頻繁に書いている人でもないし
どこかで引数や戻り値にノードリストを指定できないとか聞いたような気がするからだ。
(引数に出来ているのはMSXML 6(VB.NET Orcas付属)やGeckoのバージョンが関係して・・・ないか)

(そのため、並び替えた後に処理ができないとか、なんかそういう話があったような。
    • good
    • 0
この回答へのお礼

おくれてすいません。
なるほどです。ありがとうございます。

お礼日時:2007/12/26 11:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!