2012-10-23 5 views
1

나는 (이하 "..."비트는 간결함을 위해 생략되어있다)이처럼 보이는 XML 조각을 방출해야하는 XSLT 스타일 시트를 가지고 :스타일 시트 내에서 xsi : type 속성을 내보내는 방법은 무엇입니까?

<MyOuterType xmlns:xsi="..." xsi:type="foo:MyInnerType" xmlns:foo="..."/> 

스타일 시트는 다음과 같습니다

<xsl:stylesheet xmlns:foo="..." xmlns:xsi="..."> 
    ... 
    <xsl:template match="..."> 
    <xsl:element name="MyOuterType"> 
     <xsl:attribute name="xsi:type">foo:MyInnerType</xsl:attribute> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT 프로세서의 출력은 다음과 같다 :

<MyOuterType xmlns:xsi="..." xsi:type="foo:MyInnerType"/> 

를 말하면,이 xmlns:foo 선언 누락. 실제로 선언은 스타일 시트에 선언되어 있음에도 불구하고 방출 된 XML에서 완전히 빠져 있습니다. 이것은 방출 된 XML을 deserialize 할 필요가있을 때, 뒤죽박죽이다.

xmlns:foo을 방출 된 XML에 표시하려면 어떻게해야합니까? 이 프로세서는 XSLT 1.0을 구현합니다.

답변

0

정적으로 생성 할 네임 스페이스를 알고 있는지 여부 또는 입력 된 문서의 정보를 기반으로하는지 여부에 따라 달라집니다. 당신이 정적을 알고 있다면

, 그냥 XSL 대신 리터럴 결과 요소를 사용 요소 :

<MyOuterType xsi:type="foo:MyInnerType" xmlns:foo="....."/> 

는 동적 결정이 있다면, 그것은 조금 더 복잡합니다. XSLT 2.0에는 xsl : attribute가 특성을 생성하는 것과 거의 같은 방법으로 네임 스페이스를 생성하는 xsl : namespace 명령이 있습니다. XSLT 1.0, 트릭은 XSL을 필요한 네임 스페이스를 포함하는 요소를 생성하고 사용하는 것입니다 사본이 네임 스페이스 노드를 복사 :

<xsl:variable name="dummy"> 
    <xsl:element name="foo:dummy" namespace="{$param}"/> 
</xsl:variable> 
<MyOuterType xsi:type="foo:MyInnerType"> 
    <xsl:copy-of select="exsl:node-set($dummy)/*/namespace::foo"/> 
</MyOuterType> 

불행하게도 하나 또는 두 개의하지 - 매우 - XSLT-1.0 프로세서가 있습니다 밖에 네임 스페이스 노드를 올바르게 구현하지 않으므로주의해야합니다.

+0

첫 번째 (고정) 솔루션이 작동합니다. 두 번째 시도하지 않았다. –