2013-06-05 1 views
1

루트 노드를 변경하는 데 필요한 XML 문서가 있습니다. 작은 지식으로 내가 그물에서 긁어 낼 수 있었기 때문에 나는 XML의 자식 노드에 새로운 xmlns 속성이 있다는 점을 제외하고는 원하는 것처럼 보이게 만들 수있었습니다. 내 XSLT는 다음과 같습니다XSLT를 적용 할 때 XML 응답에 xmlns 속성을 추가하지 마십시오

<gmd:MD_Metadata xmlns="http://www.isotc211.org/2005/gmd" 
    xmlns:gco="http://www.isotc211.org/2005/gco" 
    xmlns:gmd="http://www.isotc211.org/2005/gmd" 
    xmlns:gmi="http://www.isotc211.org/2005/gmi" 
    xmlns:gml="http://www.opengis.net/gml" 
    xmlns:gmx="http://www.isotc211.org/2005/gmx" 
    xmlns:gsr="http://www.isotc211.org/2005/gsr" 
    xmlns:gss="http://www.isotc211.org/2005/gss" 
    xmlns:gts="http://www.isotc211.org/2005/gts" 
    xmlns:srv="http://www.isotc211.org/2005/srv" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.isotc211.org/2005/gmd 
    http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmd/gmd.xsd"> 
    <gmd:language> 
    <gmd:LanguageCode 
     codeList="http://www.loc.gov/standards/iso639-2/php/code_list.php" 
     codeListValue="eng" codeSpace="ISO639-2" 
     >eng</gmd:LanguageCode> 
    </gmd:language> 
    ...... 
</gmd:MD_Metadata> 

:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gmd="http://www.isotc211.org/2005/gmd" 
    xmlns:gco="http://www.isotc211.org/2005/gco" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:gml="http://www.opengis.net/gml" 
    xmlns:gmi="http://www.isotc211.org/2005/gmi"> 

    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
    <gmi:MI_Metadata 
     xmlns="http://www.isotc211.org/2005/gmi" 
     xmlns:gco="http://www.isotc211.org/2005/gco" 
     xmlns:gmd="http://www.isotc211.org/2005/gmd" 
     xmlns:gmi="http://www.isotc211.org/2005/gmi" 
     xmlns:gml="http://www.opengis.net/gml" 
     xmlns:gmx="http://www.isotc211.org/2005/gmx" 
     xmlns:gsr="http://www.isotc211.org/2005/gsr" 
     xmlns:gss="http://www.isotc211.org/2005/gss" 
     xmlns:gts="http://www.isotc211.org/2005/gts" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:srv="http://www.isotc211.org/2005/srv" 
     xsi:schemaLocation="http://www.isotc211.org/2005/gmi 
     http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd" > 
     <xsl:for-each select="/*/node()|@*"> 
     <xsl:copy-of select="." /> 
     </xsl:for-each> 
    </gmi:MI_Metadata> 
    </xsl:template> 
</xsl:stylesheet> 

을 그리고 출력은 다음과 같습니다 나는 의 xmlns를 피하기 위해 원

<gmi:MI_Metadata xmlns="http://www.isotc211.org/2005/gmi" 
     xmlns:gco="http://www.isotc211.org/2005/gco" 
     xmlns:gmd="http://www.isotc211.org/2005/gmd" 
     xmlns:gmi="http://www.isotc211.org/2005/gmi" 
     xmlns:gml="http://www.opengis.net/gml" 
     xmlns:gmx="http://www.isotc211.org/2005/gmx" 
     xmlns:gsr="http://www.isotc211.org/2005/gsr" 
     xmlns:gss="http://www.isotc211.org/2005/gss" 
     xmlns:gts="http://www.isotc211.org/2005/gts" 
     xmlns:srv="http://www.isotc211.org/2005/srv" 
     xmlns:v1="http://www.isotc211.org/2005/gmd" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.isotc211.org/2005/gmi 
     http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd"> 
    <gmd:language xmlns="http://www.isotc211.org/2005/gmd"> 
    <gmd:LanguageCode 
     codeList="http://www.loc.gov/standards/iso639-2/php/code_list.php" 
     codeListValue="eng" codeSpace="ISO639-2" 
     >eng</gmd:LanguageCode> 
    </gmd:language> 
    ....... 
</gmi:MI_Metadata> 

처럼 나는 변환을 적용 된 XML 본다 = "http://www.isotc211.org/2005/gmd" 자식 노드의 출력에, 나는 그것을 달성 할 수있는 방법이 있습니까?

<xsl:template match="/"> 
<gmi:MI_Metadata xmlns="http://www.isotc211.org/2005/gmd" .... 

의 xmlns 사라하지만 헤더/루트 노드는 클라이언트 출력에 원하는 것을되지 않습니다 : 난에 XSLT 부분을 변경할 때 것으로 나타났습니다! 그래서 나는 내가 할 수있는 일을 확신하지 못했습니다. 당신의 통찰력은 높게 평가 될 것입니다, 감사합니다.

답변

1

에 관계없이) 수동으로 수행하는 exclude-result-prefixes의, xsl:copy-of는 당, 네임 스페이스를 복사합니다 spec :

XSL : 요소-의 사본에 그 결과 나무 조각을 삽입하는 데 사용할 수 있습니다 결과 트리 ... 결과가 노드 집합 인 경우 집합의 모든 노드가 문서 순서대로 결과 트리에 복사됩니다. 요소 노드에 복사합니다 속성 노드를 복사 네임 스페이스 노드과 요소 노드뿐만 아니라 요소 노드 자체의 아이들 ...

따라서, 당신은 자신을 복사 할 (더)가 필요합니다.예를 들어, 여기에 솔루션의 한 조각이다, 규칙이 요소 복사 :

<xsl:template match="*" mode="copy" priority="1"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates select="node()|@*" mode="copy"/> 
    </xsl:element> 
</xsl:template> 

그런 다음 코드에서,

<xsl:template match="node()|@*" mode="copy"> 
    <xsl:copy />  
</xsl:template> 

그런 정상으로 물건을 사본을, 당신은 할 수

<xsl:for-each select="/*/node()|@*"> 
    <xsl:apply-templates mode="copy" select="." /> 
</xsl:for-each> 
+0

토라자부로와 @C에 감사드립니다. M. Sperberg-McQuee 님의 답변입니다. torazaburo가 제공하고 xmlns 특성을 제거 할 수있는 xslt 조각을 적용했습니다. xlink : type = "simple"이 자식 엘리먼트의 일부에 붙어있는 것을 보았습니다. 그러나 나는 그것을 처리하기 위해 뭔가를 할 수 있다고 생각합니다. 다시 한번 감사드립니다. –

0

아마도 exclude-result-prefixes 속성을 읽고 싶을 것입니다. 그들은 그 네임 스페이스를 만드는 입력에서 복사되기 때문에

그들은 물론, GMD 네임 스페이스에 대한 기본 네임 스페이스 선언이 기본 (뿐만 아니라 접두사 gmd에 바인딩). 나는 당신의 xsl : copy-of를 전통적인 아이덴티티 변환과 비슷한 것으로 변경하려고 시도한다. 그래서 자식 엘리먼트의 기본 네임 스페이스 선언을 오버라이드 (override) 할 수있다.

<xsl:copy> 
    <xsl:for-each 
    select="$ns-carrier/namespace::*[local-name() = 'xmlns']"> 
    <xsl:copy/> 
    <xsl:for-each> 
    <xsl:for-each select="@*|node()"> 
    <xsl:copy-of select="."/> 
    </xsl:for-each> 
</xsl:copy> 

(테스트하지, 그래서 소금 곡식이 걸릴.) 그것은 자신 (클라이언트!)를 생각 나게하는 데 도움이 될 수 있습니다

당신은 독특하고 네임 스페이스와 약간의 더러운 일을하지 않는 바인딩을 사용한다면 합리적으로 좋은 XML 도구 체인의 경우 이것은 순수한 외관상의 문제이며 실질적인 문제는 아닙니다. (즉, 스타일 시트에서 원하는 것을 수행 할 수 없다면 자신과 고객에게 진정으로 중요하지 않아야 함을 명심하십시오. 네임 스페이스 관리가 자동으로 수행되도록하기 위해 XSLT의 디자이너는 . 만든 매우 어려운

관련 문제