이 그것을 수행해야합니다 샘플 입력으로
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
xmlns:old="http://someurl" exclude-result-prefixes="old">
<!-- Identity transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- replace namespace of elements in old namespace -->
<xsl:template match="old:*">
<xsl:element name="{local-name()}" namespace="http://someurl2">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<!-- replace xsi:schemaLocation attribute -->
<xsl:template match="@xsi:schemaLocation">
<xsl:attribute name="xsi:schemaLocation">http://someurl some.4.0.xsd</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
을,이 제공 :
<?xml version="1.0" encoding="utf-8"?>
<catalog xmlns="http://someurl2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://someurl some.4.0.xsd">
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>
<name>Columbia</name>
</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
설명 :
마지막 두 templat을 ID 변환에 추가 된 es는 더 구체적이므로 ID 템플릿보다 더 높은 기본 우선 순위를가집니다. 이들은 "이전"네임 스페이스의 요소에 대한 ID 템플릿과 xsl : schemaLocation 특성을 각각 재정의합니다.
"old : *"의 템플릿은 대체 할 요소 (즉, 네임 스페이스가없는 이름)와 동일한 로컬 이름을 가진 요소를 출력하고 새로운 원하는 네임 스페이스를 제공합니다.
다행히 XSLT 프로세서 (또는 더 정확하게, 시리얼 라이저, 필자는 Saxon 6.5.5를 사용하고 있습니다.)는이 새로운 네임 스페이스를 기본값으로 만들기로 결정했기 때문에 기본 네임 스페이스 선언을 출력에 추가했습니다 루트 요소. 이론적으로이 새로운 네임 스페이스가 기본값인지 또는 접두어를 사용하는지 여부는 중요하지 않습니다. 그러나 당신은 그것을 디폴트로하고 싶어서 잘 작동하는 것처럼 보입니다.
아마 모든 요소의 네임 스페이스를 변경하고 싶습니까? (루트 요소의 기본 네임 스페이스 선언을 변경하면 효과가 있습니다.) – LarsH
@ user527650 : 입력 소스에 스키마 인스턴스 네임 스페이스 선언이 누락되었습니다. 좋은 대답은 –