2012-05-08 5 views
0

xns 파일에 네임 스페이스 'tns'가 있습니다. 어디서나 'tns'를 사용하지 않고 xslt를 사용하려고하지만, 대신 한 번 선언 된 tns 네임 스페이스와 일치하는 템플릿을 사용하십시오. 루트 tns : cv (xml)을 my root cv (xsl)과 일치시키고 싶습니다. xslt가 XML 요소를 표시하지만 내용은 표시하지 않으므로 xslt가 잘못되었습니다.XML XSLT namespace

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="multiLanguageToSingle.xslt"?> 
<tns:cv xmlns:tns="http://www.i8c.be/CvService/1.0"> 
    <tns:generalLanguage>nl</tns:generalLanguage> 
    <tns:careerPath> 
     <tns:current> 
      <tns:company language="nl"> 
       <tns:companyName></tns:companyName> 
       <tns:description></tns:description> 
      </tns:company> 
     </tns:current> 
     <tns:former> 
      <tns:company language="nl"> 
       <tns:companyName></tns:companyName> 
       <tns:description></tns:description> 
      </tns:company> 
     </tns:former> 
    </tns:careerPath> 
    <tns:companyDetails> 
     <tns:address> 

나는 위의 XML (처음 몇 줄)에 대한 XSL을 사용하려면이 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.i8c.be/CvService/1.0"> 
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="/tns:cv" /> 
    </xsl:template> 

<xsl:template match="/tns:cv"> 
<cv xsi:schemaLocation="http://www.i8c.be/CvService/1.0 cvDataTemplate.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xsl:variable name="language" select='"nl"'/> 
    <careerPath> 
     <current> 
     <xsl:for-each select="cv/careerPath/current/company[@language=$language]"> 
      <companyName><xsl:value-of select="companyName"/></companyName> 
      <description><xsl:value-of select="description"/></description> 
     </xsl:for-each> 
     </current> 

     <former> 
     <xsl:for-each select="cv/careerPath/former/company[@language=$language]"> 
      <companyName><xsl:value-of select="companyName"/></companyName> 
      <description><xsl:value-of select="description"/></description> 
     </xsl:for-each> 
     </former> 
    </careerPath> 

답변

1

네임 스페이스를 실현하기 위해 중요한 것은 XML 파일의 네임 스페이스가 정말 tns되지 않는 것입니다 사실 - 실제 네임 스페이스의 파일 로컬 이름/약어, 즉 http://www.i8c.be/CvService/1.0 일뿐입니다. 자, xslt 파일에서 동일한 약어를 선택했습니다 (이는 가독성을 위해 의미가 있지만 도구에 관한 한 완전히 선택 사항 임). 따라서, 당신은 cv/careerPath/current/company[@language=$language] 아무것도 일치 할 것으로 예상 할 수 없으며, 두 가지 이유 :

  • 은 XML 파일의 기본 네임 스페이스에는 careerPath 요소가 없습니다. 그것은 tns:careerPath이어야하며 XPath 문자열의 다른 구성 요소와 비슷해야합니다.
  • tns:cv 요소가 컨텍스트 노드에 이미 일치하면 xsl:tenplate이 내부에 있다는 메시지가 표시됩니다. 노드에 cv 자식이 없으므로 cv/으로 시작하는 XPath는 빈 노드 집합을 생성합니다.

따라서, 쿼리의 시작 부분에 cv/ 및 제거하거나 요소에서 충분히 멀리 일부에 xmlns="http://www.i8c.be/CvService/1.0"을 넣어

  • 추가 네임 스페이스의 규정 또는
  • 변경하여 XSLT 파일의 기본 네임 스페이스, . (이는 또한 출력에 대해 규정되지 않은 요소 이름에 영향을줍니다.)
+0

답장을 보내 주셔서 감사합니다 : –