문제
이름이없는 요소가있는 XML 문서가 있으며 XSLT를 사용하여 네임 스페이스를 추가하고 싶습니다. 대부분의 요소는 네임 스페이스 A에 있습니다. 일부는 네임 스페이스 B에있을 것입니다. 어떻게해야합니까?
해결책
foo.xml로
<foo x="1">
<bar y="2">
<baz z="3"/>
</bar>
<a-special-element n="8"/>
</foo>
및 foo.xsl
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:copy-of select="attribute::*"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates match="children()"/>
</B:a-special-element>
</xsl:template>
</xsl:transform>
나는 얻다
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
그게 당신이 찾고있는 것입니까?
다른 팁
이 레시피에는 두 가지 주요 성분이 필요합니다.
소스 재고는 신원 변환, 그리고 주요 풍미는 namespace
속성 xsl:element
.
테스트되지 않은 코드는 다음을 추가해야합니다 http://example.com/ 모든 요소에 대한 네임 스페이스.
<xsl:template match="*">
<xsl:element name="xmpl:{local-name()}" namespace="http://example.com/">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
개인 메시지 : 안녕하세요, Jeni Tennison. 나는 당신이 이것을 읽고 있다는 것을 알고 있습니다.
지금까지 내가 가지고있는 것은 다음과 같습니다.
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates />
</B:a-special-element>
</xsl:template>
이것은 거의 작동합니다. 문제는 속성을 복사하지 않는다는 것입니다. 내가 읽은 내용에서, xsl : element는 요소의 모든 속성을 as-is의 모든 속성을 복사 할 수있는 방법이 없습니다 (사용-입학장 세트는 그것을 잘라내는 것처럼 보이지 않습니다).
제휴하지 않습니다 StackOverflow