如何通过XSL以XML格式获取HTML文本

时间:2015-02-06 01:43:04

标签: xml xslt

看起来exclude-result-prefixes不适用于xsl:copy-of。 当我运行以下XML时,它的输出在<table>标记上具有命名空间,这在我的情况下不是所需的行为。最终目标是获取可能包含XML / HTML类型文本的DataItem元素,不应出于任何原因进行修改。那么获取DataItem 的最佳方法是什么?

XML

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

XSL

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

1 个答案:

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

请注意,此变体不会复制属性。