2014-06-06 3 views
0

다른 xml을 생성해야하는 xml과 xsl이 있지만 'xmlns'때문에 ​​빈 xml이 생성됩니다. XML의 루트에 'xmlns'가 없으면 정상적으로 작동합니다. 다음 XSL은 아직 완전한 버전이 아닙니다. 더 많은 논리를 넣어야하지만 'xmlns'때문에 ​​여기에 갇혀 있습니다.네임 스페이스에서 요소 선택/일치

Java API를 사용하여이 XML 및 XSL로 다른 XML을 생성하고 있습니다. 누군가가 xmlns 때문에 요소를 일치시킬 수없는 이유와 해결 방법을 말할 수 있습니까?

감사합니다.

XML :

<?xml version="1.0" encoding="UTF-8"?> 
<config xmlns="http://xmlns.company.com/config"> 
    <subi-config> 
    <primary-data-source>Repository</primary-data-source> 
    <instance> 
     <name>agent1</name> 
     <address>localhost</address> 
     <port>8080</port> 
     <admin-username>admin</admin-username> 
    </instance> 
    </subi-config> 
</config> 

XSL :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xmlns.company.com/config"> 

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 


    <xsl:template match="/"> 
     <xsl:apply-templates select="config"/> 
    </xsl:template> 


    <xsl:template match="config"> 
     <config> 
      <sub-config> 
     <primary-data-source><xsl:value-of select="sub-config/primary-data-source"/></primary-data-source> 
      <xsl:apply-templates select="sub-config"/> 
     </sub-config> 
    </config> 

</xsl:template> 


<xsl:template match="sub-config"> 
     <xsl:for-each select="instance"> 

      <instance> 
       <name><xsl:value-of select="name"/></name> 
       <address><xsl:value-of select="address"/></address> 
       <port><xsl:value-of select="port"/></port> 
       <admin-username><xsl:value-of select="admin-username"/></admin-username> 
      </instance> 

     </xsl:for-each> 

</xsl:template> 

+2

거의 모든 XSLT 질문은 "xml을 다른 xml로 변환"에 관한 내용이므로 제목을 수정했습니다. 대답에 대해 –

답변

-1

사용 XSL : 네임 스페이스 속성을 가진 요소

<xsl:template match="config"> 
    <xsl:element namespace="http://xmlns.company.com/config" name="config"> 
    <sub-config> 
     <primary-data-source><xsl:value-of select="sub-config/primary-data-source"/></primary-data-source> 
     <xsl:apply-templates select="sub-config"/> 
    </sub-config> 
    </xsl:element> 

</xsl:template> 
그것은 계산 된 이름을 가진 요소를 작성합니다

(정적에 대한 우리)와 네임 스페이스 속성을

3

을 당신은 네임 스페이스 접두사를 지정하고 원본 XML의 요소 주소 때 접두사를 사용하는 것이 필요 추가 할 수 있습니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:cfg="http://xmlns.company.com/config" 
exclude-result-prefixes="cfg"> 

<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="cfg:config"/> 
</xsl:template> 

<xsl:template match="cfg:config"> 
    <config> 
     <sub-config> 
      <primary-data-source> 
       <xsl:value-of select="cfg:sub-config/cfg:primary-data-source"/> 
      </primary-data-source> 
      <xsl:apply-templates select="cfg:sub-config"/> 
     </sub-config> 
    </config> 
</xsl:template> 

<xsl:template match="cfg:sub-config"> 
    <xsl:for-each select="cfg:instance"> 
     <instance> 
      <name><xsl:value-of select="cfg:name"/></name> 
      <address><xsl:value-of select="cfg:address"/></address> 
      <port><xsl:value-of select="cfg:port"/></port> 
      <admin-username><xsl:value-of select="cfg:admin-username"/></admin-username> 
     </instance> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

참고 sub-configsubi-config이라는 것을 두 다른 것들.

+0

고마워요. 거기에 접두어없이 그것을 할 수있는 방법이 있습니까? – user826323

+0

이론상 그렇습니다. 그러나 복잡하고 비효율적입니다. 왜 그렇게하는 것에 반대합니까? –

+0

나는 그것에 반대하지 않고있다. 나는 단지 대안이 있는지 알고 싶다. – user826323

관련 문제