2010-12-09 8 views
2

xml의 네임 스페이스 URL 값을 변경하고 싶습니다. 나는 다음과 같은 XML을 가지고있다.루트 노드의 속성 값과 네임 스페이스 URL을 변경하는 방법

<catalog xmlns="http://someurl" 
     xmlns:some="http://someurl2" 
     xsi:schemaLocation="http://someurl some.3.0.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <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> 

나는 신원 변환을 사용하고있다. 네임 스페이스 ursl에서 텍스트를 변경할 수있는 방법이 있습니까? 예를 들어 'http : // someurl'이라는 URL을 'http : // someur2'로 변경하려면 'http : // someurl some.3.0.xsd'를 'http : // someurl some.4.0.xsd'로 변경하십시오.

+0

아마 모든 요소의 네임 스페이스를 변경하고 싶습니까? (루트 요소의 기본 네임 스페이스 선언을 변경하면 효과가 있습니다.) – LarsH

+0

@ user527650 : 입력 소스에 스키마 인스턴스 네임 스페이스 선언이 누락되었습니다. 좋은 대답은 –

답변

9

이 그것을 수행해야합니다 샘플 입력으로

<?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를 사용하고 있습니다.)는이 새로운 네임 스페이스를 기본값으로 만들기로 결정했기 때문에 기본 네임 스페이스 선언을 출력에 추가했습니다 루트 요소. 이론적으로이 새로운 네임 스페이스가 기본값인지 또는 접두어를 사용하는지 여부는 중요하지 않습니다. 그러나 당신은 그것을 디폴트로하고 싶어서 잘 작동하는 것처럼 보입니다.

+0

+1입니다. –

+0

정말 좋은 대답입니다. +1 – khachik

+0

@Dimitre, @khachik, 감사합니다. – LarsH

관련 문제