2011-01-04 2 views
2

один с префиксом пространства имен с «EMP»извлечение части XML, указав без префикса пространства имен в XSLT

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

, а другие без префикса пространства имен.

<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> 

Я написал ниже XSLT для извлечения только <ProjectDetails>, что не имеет префикса пространства имен определено.

<?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/*" />.

Мой вопрос: есть ли вообще мы можем написать обычный xslt для извлечения части xml.

+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']/*". Этот подход позволяет обрабатывать оба типа входных документов с одним атрибутом select в вашей таблице стилей.

Смежные вопросы