1

次のような 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'

ありがとう、

4

1 に答える 1

0

xsl:sort代わりに適用テンプレートに入れる必要があると思いますref

これはうまくいくようです...

<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: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:sort select="local-name(key('mykeys', @xlink:href))" order="descending"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="ref">
        <xsl:apply-templates select='key("mykeys", @xlink:href)' />     
    </xsl:template>

    <xsl:template match='b | c' >
        <xsl:value-of select="."  />
    </xsl:template>

</xsl:stylesheet>

また、[local-name()]このコンテキストでの使用は、要素にローカル名があるかどうかを確認するだけです。これはあなたが意図したものではないと思います。

使用したい場合local-name()は、 XPath を引数としてlocal-name()like:に入れますlocal-name(/some/xpath/*)local-name()(XPath 2.0/XSLT 2.0 では、次のようにパスの最後に置くこともできます。/some/xpath/*/local-name()

于 2013-08-29T06:07:53.783 に答える