2010-05-10 3 views
13

를 사용하여 XML에 네임 스페이스 + 접두사를 추가 :이의 내가 XML 다음과 같은 한 가정 해 봅시다 ... 난 당신이 도울 수 있기를 바랍니다 XSL

<data> 
    <token> 
     <sessionId>12345</sessionId>   
     <userId>john</userId> 
     <moreInfo> 
     <bla> ..... 
     </bla> 
     </moreInfo> 
    </token> 
</data> 

그리고 나는이

<login:data xmlns:login="http://my.ns.uri"> 
     <login:token> 
      <login:sessionId>12345</sessionId>   
      <login:userId>john</userId> 
      <login:moreInfo> 
      <login:bla> ..... 
      </login:bla> 
      </login:moreInfo> 
     </login:token> 
    </login:data> 

내가 할 수 될 필요 이 XSL로? 나는 노력했지만 비참하게 실패했다 ... 어떤 도움이라도 대단히 감사 할 것이다!

감사합니다, 월

+2

사실, 당신이 생산하는 나쁜 XML입니다 여기에

은 사양입니다. 당신은'xmlns : login = "http : //my.ns.uri"'를 원한다. –

+0

네 말이 맞아, 내가 원하는거야. xmlns : login = "http : //my.ns.uri" 하지만 XSL로 그런 식으로 무엇을 할 수 있습니까? – Jan

+0

좋은 질문 (+1). 완전하고 정확한 해결책은 내 대답을 참조하십시오. :) –

답변

12

사용 :이 변환이 제공된 XML 문서에 적용되는

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:login="http://my.ns.uri"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:element name="login:{name()}" namespace="http://my.ns.uri"> 
    <xsl:copy-of select="namespace::*"/> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

, 원하는 정확한 결과가 생성됩니다 :

<login:data xmlns:login="http://my.ns.uri"> 
    <login:token> 
     <login:sessionId>12345</login:sessionId> 
     <login:userId>john</login:userId> 
     <login:moreInfo> 
     <login:bla> ..... 
     </login:bla> 
     </login:moreInfo> 
    </login:token> 
</login:data> 
+0

고마워, 그게 내가 의미하고 정확히 필요한거야, 당신은 나쁜 두통에서 나를 구해 줬어 :) – Jan

0
<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="http://my.ns.uri"> 
    <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 
+0

좋아요, 이걸 이해합니다. 하지만 모든 요소의 접두어를 어떻게 바꿀 수 있습니까? – Jan

+0

접두사는 XML에서 매우 유동적 인 내용입니다. 제 말은 스펙이 명시 적으로 말하자면, 그들은 임의적이라고 말합니다. 따라서 XSLT 프로세서는 원하는대로 원하는대로 변경할 수 있습니다. 그러나 모든 XSLT 엔진 (XSLT의'exclude-result-prefix'와 같이)은 XSLT 엔진이 당신의 여는''태그에 쓴 쓰레드를 다시 사용합니다.). – Boldewyn

+0

좋아, 이걸 가지고 놀아 보자 .... 고마워! – Jan

0

XSLT 2.0이 더 효율적이고 컴팩트합니다. 노드에 직접 네임 스페이스를 추가 할 수 있습니다. 우리는 스타일 시트의 시작 부분에 어떤 것도 정의 할 필요가 없다. creating namespace prefix

사용 :

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="*"> 
    <xsl:element name="login:{name()}" xmlns:login="http://my.ns.uri"> 
    <xsl:namespace name="login">http://my.ns.uri</xsl:namespace> 
    <xsl:value-of select="node()"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

그것은 출력을 제공합니다 :

<login:data xmlns:login="http://my.ns.uri"> 
    <login:token> 
     <login:sessionId>12345</login:sessionId> 
     <login:userId>john</login:userId> 
     <login:moreInfo> 
     <login:bla> ..... 
     </login:bla> 
     </login:moreInfo> 
    </login:token> 
</login:data> 
관련 문제