2

次の XSLT 変換では、関数 node-name() を使用しようとするとエラーが表示されます。

エラー: E[Saxon6.5.5] URI http://www.w3.org/2005/xpath-functionsは外部 Java クラスを識別しません

<xsl:stylesheet version="1.1" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions">
<!--
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-->        

    <xsl:output method="text" />
    <xsl:variable name="in" select="/"/>
    <xsl:variable name="filter" select="document('elementsToBeLeftIn.xml')"/>

    <xsl:template match="/">
        <xsl:apply-templates select="*">
            <xsl:with-param name="f" select="$filter/*"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="*">
        <xsl:param name="f"/>
        <xsl:choose>
            <xsl:when test="$f/*">
                <xsl:copy-of select="fn:node-name()"/>

                <!--
                <xsl:for-each select="*[fn:node-name(.) = $f/*/fn:node-name(.)]">
                    <xsl:apply-templates select=".">
                        <xsl:with-param name="f" select="f/*[fn:node-name() = current()/fn:node-name()]"/>
                    </xsl:apply-templates>
                </xsl:for-each>
                -->
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>    

ありがとうデビッド。これは私が本当にやりたいことです(再帰的です)。を使用しname()てもエラーが発生します*Unexpected tocken [<function>] in path expression*

お先にどうぞ

<xsl:stylesheet version="1.1" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions">
<!--
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-->        

    <xsl:output method="text" />
    <xsl:variable name="in" select="/"/>
    <xsl:variable name="filter" select="document('elementsToBeLeftIn.xml')"/>

    <xsl:template match="/">
        <xsl:apply-templates select="*">
            <xsl:with-param name="f" select="$filter/*"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="*">
        <xsl:param name="f"/>
        <xsl:choose>
            <xsl:when test="$f/*">
                <xsl:for-each select="*[name() = $f/*/name()]">
                    <xsl:apply-templates select=".">
                        <xsl:with-param name="f" select="f/*[name() = current()/name()]"/>
                    </xsl:apply-templates>
                </xsl:for-each>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>    
4

2 に答える 2

0

XSLT2 でも、node-name() のような標準関数の前に付ける必要はありません。ただし、XSLT1 である saxon 6 を使用しているため、関数に接頭辞を付けてはなりません。そうしないと、認識されません。(XPath 1 標準関数は名前空間にありません)

ただ使うselect="name()"

ただし、コードが期待どおりに機能するとは思いませんが (ただし、何をしたいのかは言いませんでした)、テンプレートは 1 つの要素 (最上位のドキュメント要素) にのみ適用されるため、テンプレートは再帰的に適用されることはありません。 .

フィルター テストが true の場合、<xsl:copy-of select="name()"その要素の名前がマークアップなしで出力されます (したがって、結果は整形式の xml にはなりません)。

フィルター テストが false の場合、すべての子を含むドキュメント要素全体が出力にコピーされ、それ以上の処理は行われません。

$f/*/name()

は XPath2 では有効ですが、XPath 1 では有効ではありません。使用するパス式/は、文字列を返す関数で終わらないノードのみを使用できます。何をしたいのか正確にわからないので、すぐに代替品を提供することはできません。

 current()/name()

次のように書くことができます

 name(current())

XPath 1で。

しかし、saxon Java 実装を使用しているのであれば、saxon 6 の代わりに単に saxon 9 を使用して、xslt エンジンでの 10 年以上の価値のあるさらなる開発の恩恵を受けてみませんか?

于 2012-07-25T14:02:42.680 に答える
0

Saxon 6.5.5 は XSLT 1.0 エンジンです。名前空間http://www.w3.org/2005/xpath-functionsは、XPATH 2.0、XSLT 2.0、および XSLT 3.0 用です。XSLT 1.0 は、この名前空間を認識しません。そのため、エラーが発生しています。

http://www.w3.org/2005/xpath-functionsに相当する XSLT 1.0 はありません。プレフィックスなしで関数を呼び出すだけです。

于 2012-07-25T14:26:21.287 に答える