2011-01-04 11 views
2

いずれかで名前空間プレフィックスなしで指定することによって、XMLの部分を抽出します。「EMP」</p> ​​<p>と名前空間の接頭辞なしで相互に名前空間プレフィックスとXSLT

<emp:Employees xmlns:emp="http://www.xyz.com"> 
    <EmployeeDetails> 
     <EmployeeCompanyDetails> 
      <CompanyName>XYZ</CompanyName> 
      <Desgination>Engineer</Desgination> 
      <YearOfExp>8</YearOfExp> 
      <Department>HR</Department> 
      <ProjectDetails> 
       <ProjectName>ABC</ProjectName> 
       <Client>ZZZ</Client> 
       <Manager>MMMM</Manager> 
      </ProjectDetails> 
     </EmployeeCompanyDetails> 
    </EmployeeDetails> 
</emp:Employees> 

私だけ<ProjectDetails>定義された名前空間接頭辞を持たないことを抽出するには、以下のXSLTを書かれています。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:emp="http://www.xyz.com" version="1.0"> 
    <xsl:template match="/"> 
     <emp:ProjectDetails>   
      <xsl:copy-of select="*//ProjectDetails/*" /> 
      <xsl:copy> 
       <!--xsl:apply-templates /--> 
      </xsl:copy> 
     </emp:ProjectDetails> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:element name="ns:{local-name()}"> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

上記のxsltは、入力xmlが名前空間接頭辞を持たない場合に機能します。 入力xmlに名前空間接頭辞emp:があるとしたら、私のxsltコードを<xsl:copy-of select="*//emp:ProjectDetails/*" />に変更する必要があります。

私の質問:xmlの一部を抽出する共通のxsltを書くことはできますか?

+0

良い質問、+1を。私の答えは、非常に短くて完全な解決策を見てください。 :) –

答えて

3

あなたはを使用することができます。

<xsl:copy-of select="//*[local-name() = 'ProjectDetails']"/> 
3

XSLT 2.0では、ワイルドカードselect="*//*:ProjectDetails/*"を使用できます。 XSLT 1.0では、select="*//emp:ProjectDetails/* | *//ProjectDetails/*"またはselect="*//*[local-name() = 'ProjectDetails']/*"を使用できません。このアプローチでは、スタイルシートに1つのselect属性を持つ両方の種類の入力ドキュメントを処理できます。

関連する問題