次のような XML があります。
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" version="2.8.1" vocab-version="2013-02-28" >
<section1>
<a xml:id="a100">
<ref xlink:href="#aXXX"/>
<ref xlink:href="#aYYY"/>
</a>
</section1>
<section2>
<b xml:id="aXXX">
DataB
</b>
<c xml:id="aYYY">
DataC
</c>
</section2>
</root>
次の XSLT を適用します。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="db:para db:literallayout" />
<xsl:param name="code" />
<xsl:key name='mykeys' match='/root/section2/*' use='concat("#", @xml:id)'/>
<xsl:template match="/" >
<xsl:apply-templates select='/root/section1/a/ref'>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ref">
<xsl:apply-templates select='key("mykeys", @xlink:href)' >
</xsl:apply-templates>
</xsl:template>
<xsl:template match='b | c' >
<xsl:value-of select="." />
</xsl:template>
</xsl:stylesheet>
私はこのような出力をしたい:
DataC
DataB
c のテキストは b のテキストの前にあることに注意してください
次のような xsl:sort を apply-templates に追加する必要があると思います。
<xsl:sort select='/root/section2/*[concat("#", @xml:id)=current()/@xlink:href][local-name()]' order="descending" /
>
すなわち:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:db="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="db:para db:literallayout" />
<xsl:param name="code" />
<xsl:key name='mykeys' match='/root/section2/*' use='concat("#", @xml:id)'/>
<xsl:template match="/" >
<xsl:apply-templates select='/root/section1/a/ref'>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="ref">
<xsl:apply-templates select='key("mykeys", @xlink:href)' >
<xsl:sort select='/root/section2/*[concat("#", @xml:id)=current()/@xlink:href][local-name()]' order="descending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match='b | c' >
<xsl:value-of select="." />
</xsl:template>
</xsl:stylesheet>
しかし、うまくいきません。</p>
順序付けは xml:id に基づくことはできません。また、テキスト (つまり、 datac 、 datab など) に基づくこともできないことに注意してください。すなわち、)のみ。
select='/root/section2/*[concat("#", @xml:id)=current()/@xlink:href][local-name()]' の実際の値を理解しようとしましたか? したがって、パラメーターとしてテンプレートに送信しました。
<xsl:template match="a">
<xsl:apply-templates select='key("mykeys", @xlink:href)' >
<xsl:with-param name='testparameter' select='/root/section2/*[concat("#", @xml:id)=current()/@xlink:href][local-name()]' />
</xsl:apply-templates>
</xsl:template>
<xsl:template match='b | c' >
<xsl:param name='testparameter' />
<xsl:value-of select='$testparameter' />
</xsl:template>
そして驚くべきことに、各要素のテキスト (つまり、 b と c ではなく DataB と DataC ) であり、順序の種類 (降順) も適用されていない場合、それは要素の名前ではありませんでした。
次のような出力を得る方法を教えてください。
DataC
DataB
datac と datab は要素を介してのみアクセスできる必要があることに注意してください。これは、使用できないことを意味します
apply-templates select='/root/section2/b' or apply-templates select='/root/section2/c'
ありがとう、