2012-02-19 4 views
4

WSDL定義を別の形式に変換して処理しようとしていますが、問題が発生しました。私は文字列に変換されていない関数からQName値を返すように見えることはできません。ユーザー定義関数からQNamesを返す

エラーの動作を維持しながら、ファイルを次のように縮小しました。元の関数は、target-namespace属性を使用して接頭辞なしの値を変換することを想定していました。この属性には、<xs:schema>またはが含まれています。

例XSLTドキュメント:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://www.example.com/xslt" 
    exclude-result-prefixes="#all" version="2.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:function name="my:resolve-QName2" as="xs:QName"> 
     <xsl:param name="name" as="xs:string"/> 
     <xsl:param name="element" as="element()"/> 
     <xsl:value-of select="resolve-QName($name,$element)"/> 
    </xsl:function> 

    <xsl:template match="/definitions"> 
     <xsl:variable name="qname" select="my:resolve-QName2('xs:string',.)" as="xs:QName"/> 
     <QName> 
      <prefix><xsl:value-of select="prefix-from-QName($qname)"/></prefix> 
      <local><xsl:value-of select="local-name-from-QName($qname)"/></local> 
      <namespace><xsl:value-of select="namespace-uri-from-QName($qname)"/></namespace> 
     </QName> 
    </xsl:template> 
</xsl:stylesheet> 

入力ファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

期待される結果:

<?xml version="1.0" encoding="UTF-8"?> 
<QName> 
    <prefix>xs</prefix> 
    <local>string</local> 
    <namespace>http://www.w3.org/2001/XMLSchema</namespace> 
</QName> 

R unning上記のコード、サクソン9.3.0.5 XSLTプロセッサはエラーで停止されています

Required item type of result of function my:resolve-QName2() is xs:QName. Cannot convert string to type {xs:QName}

エンジンが最初の文字列にするQNameを鋳造し、その後、失敗したQNameに戻ってそれをキャストしようとしているようです。私は2つのas="xs:QName"を削除した場合、私は次のエラーを取得する:

Required item type of first argument of prefix-from-QName() is xs:QName. Cannot convert string to type {xs:QName}

はどのようにして、関数からのQNameを返すことができますか?

これはSaxon XSLTプロセッサのバグですか、それともXSLTについて誤解していますか?

上記のファイルを処理できるXSLTエンジンはありますか?

答えて

2

問題は、ここである:

<xsl:value-of select="resolve-QName($name,$element)"/> 

これはresolve-QName()戻ることのQNameからのテキスト・ノード(文字列)を生成します。

ただし、my:resolve-QName2xs:QNameではなくxs:stringではないと宣言され、正しく報告されたエラーが発生します。

ソリューション

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:my="http://www.example.com/xslt" 
     exclude-result-prefixes="#all" version="2.0"> 

     <xsl:output method="xml" indent="yes"/> 

     <xsl:function name="my:resolve-QName2" as="xs:QName"> 
      <xsl:param name="name" as="xs:string"/> 
      <xsl:param name="element" as="element()"/> 
      <xsl:sequence select="resolve-QName($name,$element)"/> 
     </xsl:function> 

     <xsl:template match="/definitions"> 
      <xsl:variable name="qname" select="my:resolve-QName2('xs:string',.)" as="xs:QName"/> 
      <QName> 
       <prefix><xsl:value-of select="prefix-from-QName($qname)"/></prefix> 
       <local><xsl:value-of select="local-name-from-QName($qname)"/></local> 
       <namespace><xsl:value-of select="namespace-uri-from-QName($qname)"/></namespace> 
      </QName> 
     </xsl:template> 
</xsl:stylesheet> 

提供されるXML文書に適用されます:修正変換が今

<xsl:sequence select="resolve-QName($name,$element)"/> 

がで上記を交換

<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

指名手配、正しい結果がが生成されます

<QName> 
    <prefix>xs</prefix> 
    <local>string</local> 
    <namespace>http://www.w3.org/2001/XMLSchema</namespace> 
</QName> 
+1

[OK]をクリックします。関数では、常にの代わりに ''を使用してください。カウンター直感的なビットですが、機能します。 –

+0

@MizardX:機能だけでなく、 atomization/stringを文字列に変換したい場合や、 'separator'属性を使用する場合は、 –

+3

を使用してください。XSLT 2.0でデータモデルの変更を導入したとき、( (xsl:sequence、xsl:value-of)と呼ばれる命令の場合は、xsl:value-of、xsl:text)、後方互換性の影響はあまりにも大きかった。だから、そうですね、これら2つの命令は、その名前が示唆しているものを全くしないことを覚えておいてください。 –

関連する問題