0

次のXMLコードがあります。

<training_center>
<course id="XML">
    <title>Course 1</title>
    <keywords>
        <keyword>XML</keyword>
        <keyword>XPath</keyword>
    </keywords>
    <teachers>
        <teacher>Nikitin</teacher>
        <teacher>Pavlov</teacher>
    </teachers>
</course>
<course id="AJAX">
    <title>Course 2</title>
    <keywords>
        <keyword>AJAX</keyword>
        <keyword>XML</keyword>
    </keywords>
    <teachers>
        <teacher>Nikitin</teacher>
        <teacher>Chebykin</teacher>
    </teachers>
</course>
</training_center>

そして、次のXSLコード:

<xsl:key 
    name='concat_key'
    match="/training_center/course"
    use="concat(teachers/teacher, ':', keywords/keyword)"
/>
<xsl:template match="/">                
    <xsl:apply-templates select="key('concat_key', concat('Nikitin',':','XML'))" />
</xsl:template>
<xsl:template match="course">
    <xsl:element name="course">         
        <xsl:value-of select="./title" />
    </xsl:element>
</xsl:template>

XSL 変換コース 1のみが表示されます。しかし、論理的にコース 2も表示されます。
どのエラーで?

4

2 に答える 2

0

concat(teachers/teacher, ':', キーワード/キーワード) は、すべての training_center/course の最初の先生/先生、':'、および最初のキーワード/キーワードを連結します。しかし、2番目の「コース」では、AJAXが最初の「キーワード」です。

于 2014-02-21T18:32:20.560 に答える
0

あなたが XSLT 1.0 を使用していると仮定しているのは... [あなたの結果に基づく知識に基づいた推測] のためです。

まず、メソッドが機能しない理由は、関数がnode-setsではなくstring-valuesconcat()で機能するためです。

concat(teacher, ':', keyword)

は次のように評価されます。

concat(string(teacher), ':', string(keyword))

そして (XSLT 1.0 では)セット内の最初のノードstring(node-set)の文字列値を返します。

目標を達成するために使用できる他の方法があります。たとえば、次のとおりです。

1. 述語でキーを使用します。

<xsl:key name="course-by-teacher" match="course" use="teachers/teacher" />

<xsl:template match="/">
    <output>
        <xsl:apply-templates select="key('course-by-teacher', Nikitin')[keywords/keyword='XML']" />
    </output>
</xsl:template>

<xsl:template match="course">
    <course>         
        <xsl:value-of select="title" />
    </course>
</xsl:template>

2. 2 つのキーの共通部分を使用します。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:set="http://exslt.org/sets"
extension-element-prefixes="set">
<xsl:output method='xml' version='1.0' encoding='utf-8' indent='yes'/>

<xsl:key name="course-by-teacher" match="course" use="teachers/teacher" />
<xsl:key name="course-by-keyword" match="course" use="keywords/keyword" />

<xsl:template match="/">
    <output>
        <xsl:apply-templates select="set:intersection(key('course-by-teacher', 'Nikitin'), key('course-by-keyword', 'XML'))" />
    </output>
</xsl:template>

<xsl:template match="course">
    <course>         
        <xsl:value-of select="title" />
    </course>
</xsl:template>

</xsl:stylesheet>

このメソッドには、set:intersection()多くの XSLT 1.0 プロセッサでサポートされている EXSLT 関数が必要ですが、すべてのプロセッサでサポートされているわけではないことに注意してください。必要に応じて、XSLT 1.0 でネイティブに 2 つのノード セットの交差を生成できる (より複雑な) メソッドを投稿します。

于 2014-02-22T03:05:57.757 に答える