2

XMLCompiledTransform で使用するために msxml:script を使用する XSL スクリプトを作成しましたが、それを必要とする人々は、そのスクリプトは Linux/Perl 環境では機能しないと言っていました (これは文字通り、彼らが XSL をどのように使用しているかについて私が知っている限りです。 ) 「Microsoft 固有の拡張機能を使用している」ためです。そこで、xsl:script を使用して XSL をより中立なものにしようとしています。しかし、私はそれを機能させるのに苦労しています。

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:theScript="urn:CustomScript" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xsl theScript fo xs fn">
<xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8" omit-xml-declaration="no"/>
  <xsl:script language="javascript" implements-prefix="theScript">
      <![CDATA[
      function test() {return "test"; }
      ]]>
  </xsl:script>
  <xsl:template match="/">
    <test>
      <xsl:value-of select="theScript:test()" />
    </test>
  </xsl:template>
</xsl:stylesheet>

上記では、「接頭辞 'urn:CustomScript' を実装するスクリプトまたは外部オブジェクトが見つかりません」というエラーが表示されます。

それを取り除くとxmlns:theScript="urn:CustomScript"、「Prefix 'theScript' is not defined.」というエラーが表示されます。

また、「theScript」プレフィックスのすべての痕跡を削除して使用しようとしましimplements-prefix="local"たが、それも機能しません。test不明な XSLT 関数であることがわかります。

ここで何か間違ったことをしているだけですか、それとも XMLCompiledTransform はサポートしていませんxsl:scriptか?

4

2 に答える 2

2

xsl:scriptはXSLT1.1でのみ定義されていますが、この標準はXSLT2.0を優先してキャンセルされたため、移植性を求めている場合は、実際には使用しないことをお勧めします。

XSLTの最も移植性の高い形式は、はるかに多くのサポートがあるため、間違いなくXSLT1.0です。XSLT2.0の方が間違いなく簡単なこともありますが、実行したいほとんどの「スクリプト」コードはXSLTだけで実行できることがわかるでしょう。XSLT2.0は関数を定義できますが、XSLT1.0の名前付きテンプレートを使用して関数をエミュレートできます。これは、少し面倒です。

XSLT2.0:

<xsl:template match="/">
  <xsl:value-of select="test('param')" />
</xsl:template>

<xsl:function name="test" as="xs:string">
  <xsl:param name="param" as="xs:string" />
  <xsl:text>Test</xsl:text>
</xsl:function>

XSLT1.0:

<xsl:template match="/">
  <xsl:call-template name="test">
    <xsl:with-param name="param" select="'param'" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="test">
  <xsl:param name="param" />
  <xsl:text>Test</xsl:text>
</xsl:template>

ただし、この例ではパラメーターは使用されていませんが、わかります。

于 2011-07-08T23:12:29.797 に答える
1

xsl:scriptXSLT には命令はありません。

XMLCompiledTransformNET の一部であるクラスはありません。

.NET に付属する System.Xml.Xsl 名前空間の既存のXslCompiledTransformクラスは、準拠する XSLT 1.0 プロセッサを実装します。そのため、命令はサポートされませんxsl:script

推奨事項: XSLT アプリケーションの真の移植性を実現するには、(インラインであろうとなかろうと) 拡張関数、または文書化されていない、必須ではない、または非準拠の機能を使用しないでください。

多くの XSLT 1.0 プロセッサが EXSLT をサポートしていますが、プロセッサはEXSLT 拡張機能XslCompiledTransformのみをサポートしています。node-set()

于 2011-07-08T22:44:12.807 に答える