2012-02-19 5 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에 다시 캐스팅하려고하는 것 같다 . 나는 두 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)"/> 

이는의 QName 그 resolve-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

확인. 함수와 함께 항상 대신''를 사용하십시오. 조금 카운터 직관적이지만 작동합니다. –

+0

@MizardX : 기능뿐만 아니라. 원자화/문자열 변환을 원한다면, 그리고/또는'separator' 속성을 사용하기를 원한다면 –

+3

을 사용하십시오. XSLT 2.0에서 데이터 모델 변경 사항을 도입했을 때 우리는 ((xsl : sequence, xsl : value-of)에 대한 지시 사항에 대해서는 xsl : value-of, xsl : text를 사용하지만 역 호환성 문제는 너무 심각합니다. 그래서, 네,이 두 가지 지시가 그들의 이름이 제안하는 것을 꽤하지 않음을 기억하십시오. –