看起来exclude-result-prefixes
不适用于xsl:copy-of
。
当我运行以下XML时,它的输出在<table>
标记上具有命名空间,这在我的情况下不是所需的行为。最终目标是获取可能包含XML / HTML类型文本的DataItem元素,不应出于任何原因进行修改。那么获取DataItem 的最佳方法是什么??
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<root>
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<ApplicationData>
<TraceData>
<DataItem>
<table>
<tr>
<td>This should not be a table</td>
<td>It must be a text</td>
</tr>
</table>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
</root>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:te="http://schemas.microsoft.com/2004/06/E2ETraceEvent"
exclude-result-prefixes="te">
<xsl:output method="html" indent="no"/>
<xsl:template match="/">
<html>
<body>
<table>
<thead>
<tr>
<td>Data</td>
</tr>
</thead>
<tbody>
<xsl:for-each select="//te:E2ETraceEvent">
<tr>
<td>
<table>
<xsl:for-each select=".//te:TraceData//te:DataItem">
<tr>
<td>
<xmp>
<xsl:copy-of select="*" />
</xmp>
</td>
</tr>
</xsl:for-each>
</table>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<table xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<tr>
<td>This should not be a table</td>
<td>It must be a text</td>
</tr>
</table>
<table>
<tr>
<td>This should not be a table</td>
<td>It must be a text</td>
</tr>
</table>
答案 0 :(得分:0)
那么获取DataItem的最佳方法是什么?
获取源节点 的最佳方法是复制它。然而, copy 表示 copy - 包括命名空间/ s。
如果您不想要命名空间(即不想要获取源节点 ,因为它 ),那么您无法复制现有节点。你必须建造新的。所以而不是做:
<xsl:copy-of select="*"/>
做的:
<xsl:apply-templates select="*"/>
然后:
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
请注意,此变体不会复制属性。