一个名称空间前缀为'emp'
<?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>
如果输入xml没有名称空间前缀,则上面的xslt将起作用。
假设输入xml带有名称空间前缀emp:
,那么我需要将我的xslt代码更改为<xsl:copy-of select="*//emp:ProjectDetails/*" />
。
我的问题:无论如何我们可以编写一个通用的xslt来提取xml的一部分。
答案 0 :(得分:4)
您可以使用:
<xsl:copy-of select="//*[local-name() = 'ProjectDetails']"/>
答案 1 :(得分:3)
使用XSLT 2.0,您可以使用通配符select="*//*:ProjectDetails/*"
。使用XSLT 1.0,没有什么可以阻止您使用select="*//emp:ProjectDetails/* | *//ProjectDetails/*"
或select="*//*[local-name() = 'ProjectDetails']/*"
。这种方法允许您在样式表中使用一个select属性处理这两种输入文档。