如何使用XSLT复制文字XML代码(提供的示例)

时间:2015-07-02 14:37:32

标签: xml xslt

这是我的XML代码:

<?xml version="1.0" encoding="UTF-8"?> <catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
</cd>
</catalog>

这是我的XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
     <xsl:for-each select="catalog/cd">
      <tr>
        <tr><br/><xsl:value-of select="title"/></tr>
        <tr><br/><xsl:value-of select="artist"/></tr>
        <tr><br/><xsl:value-of select="country"/></tr>
      </tr>
      <br/>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

这是我的输出:

Empire Burlesque 
Bob Dylan 
USA 

这是我想要的输出:

<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>

有关如何获得我想要的输出(即文字XML代码)的任何建议?我无法弄明白。

2 个答案:

答案 0 :(得分:0)

使用IE,您可以将元素序列化的任务委托给JScript或VBScript中实现的扩展函数的字符串,而Google Chrome似乎仍然支持xmp元素,对于Mozilla而言,无论如何需要编写或合并纯XSLT解决方案。

以下是IE和Chrome的示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="ms mf">

<xsl:output method="html" indent="yes"/>

<ms:script language="JScript" implements-prefix="mf">
function serialize(nodeSelection) {
  return nodeSelection[0].xml;
}
</ms:script>

<xsl:template match="/">
  <html lang="en">
    <head>
      <title>Test</title>
    </head>
    <body>
      <h1>Test</h1>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="catalog">
  <table>
    <tbody>
      <xsl:apply-templates/>
    </tbody>
  </table>
</xsl:template>

<xsl:template match="cd">
  <tr>
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="cd/*">
  <td>
    <xsl:choose>
      <xsl:when test="function-available('mf:serialize')">
        <xsl:value-of select="mf:serialize(.)"/>
      </xsl:when>
      <xsl:otherwise>
        <xmp>
          <xsl:copy-of select="."/>
        </xmp>
      </xsl:otherwise>
    </xsl:choose>
  </td>
</xsl:template>

</xsl:stylesheet>

将节点序列化为字符串表示形式的复杂但完整的纯XSLT解决方案位于http://lenzconsulting.com/xml-to-string/

答案 1 :(得分:0)

如果您的真实要求与您的人为设定的示例一样简单,那么您可能只会逃避:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
    <table>
        <xsl:for-each select="catalog/cd">
            <tr>
                <td>
                    <xsl:text>&lt;title&gt;</xsl:text>
                    <xsl:value-of select="title"/>
                    <xsl:text>&lt;/title&gt;</xsl:text>
                </td>
                <td>
                    <xsl:text>&lt;artist&gt;</xsl:text>
                    <xsl:value-of select="artist"/>
                    <xsl:text>&lt;/artist&gt;</xsl:text>
                </td>
                <td>
                    <xsl:text>&lt;country&gt;</xsl:text>
                    <xsl:value-of select="country"/>
                    <xsl:text>&lt;/country&gt;</xsl:text>
                </td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

或稍微优雅一点:

<xsl:template match="/">
    <table>
        <xsl:for-each select="catalog/cd">
            <tr>
                <xsl:for-each select="*">
                    <td>
                        <xsl:value-of select="concat('&lt;', name(), '&gt;')"/>
                        <xsl:value-of select="."/>
                        <xsl:value-of select="concat('&lt;/', name(), '&gt;')"/>
                    </td>
                </xsl:for-each>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>