2015-07-02 3 views
-1

Вот мой XML код:Как скопировать буквенный код XML с помощью XSLT (пример прилагается)

<?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-код? Я не смог понять это.

+0

Пожалуйста, объясните более подробно, чего вы хотите достичь: хотите ли вы создать документ с результатами HTML, который отображает разметку «title» и других элементов? Также обратите внимание, что ваш текущий HTML выглядит довольно странно, а элементы 'tr' вложены в' tr'. –

+0

Также в какой браузер вы нацеливаетесь? –

+0

@ user3373665 http://stackoverflow.com/help/someone-answers –

ответ

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

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> 
Смежные вопросы