1

输入 XML

<note>
<from>Example</from>
<heading>Reminder</heading>
<body>XSLT conversion</body>
</note>

预期输出 XML。

<xml>
  <data>
    <column1>
      &lt;note&gt;
      &lt;from&gt;Example&lt;/from&gt;
      &lt;heading&gt;Reminder&lt;/heading&gt;
      &lt;body&gt;XSLT conversion&lt;/body&gt;
      &lt;/note&gt;
    </column1>
  </data>
</xml>

我们使用的当前 XSLT 在加载输入时遇到了一些问题。(如果输入是直接的 XML,我们在复制它时没有任何问题,它只是使用编码的 XML)。

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

  <xsl:template match="/">
    <xml>
      <data>
        <column1>
          <xsl:copy>
            <xsl:copy-of select="/node()"/>
          </xsl:copy>
        </column1>
      </data>
    </xml>
  </xsl:template>

</xsl:stylesheet>
4

2 回答 2

3

由于您使用的是 XSLT 2.0,因此您可以使用它unparsed-text()来处理您的输入。如果将文本文件的路径作为参数传递,则可以使用具有相同样式表的文本或 XML 输入。

  • 如果输入是文本,则将文本文件的路径作为参数传递。您仍然必须将 XML 传递给样式表,因此您可以使用样式表本身作为输入。
  • 如果输入是 XML,则不要将值传递给参数。

输入(test.txt)

&lt;note&gt;
&lt;from&gt;Example&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;XSLT conversion&lt;/body&gt;
&lt;/note&gt;

XSLT 2.0(使用样式表作为 xml 输入并test.txt作为input参数传递)

<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xs">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="input" select="''" as="xs:string"/>

    <xsl:template match="/">
        <xml>
            <data>
                <column1>
                    <xsl:choose>
                        <xsl:when test="$input">
                            <xsl:copy-of select="unparsed-text($input)"/>                           
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:copy-of select="*"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </column1>
            </data>
        </xml>
    </xsl:template>

</xsl:stylesheet>

输出

<xml>
   <data>
      <column1>&amp;lt;note&amp;gt;
&amp;lt;from&amp;gt;Example&amp;lt;/from&amp;gt;
&amp;lt;heading&amp;gt;Reminder&amp;lt;/heading&amp;gt;
&amp;lt;body&amp;gt;XSLT conversion&amp;lt;/body&amp;gt;
&amp;lt;/note&amp;gt;
</column1>
   </data>
</xml>
于 2013-05-13T21:51:56.087 回答
1

您的“输入 XML”根本不是 XML——它只是一段文本。

一个有效的 XML 文档必须有一个根元素,而您的根本没有元素,除非文件中除了您显示的文本之外还有其他内容。

如果您将 XML 包装在一个虚拟根元素中,就像这样

<root>
&lt;note&gt;
&lt;from&gt;Example&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;XSLT conversion&lt;/body&gt;
&lt;/note&gt;
</root>

然后您可以使用此样式表对其进行转换

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

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <xml>
      <data>
        <column1>
          <xsl:value-of select="root"/>
        </column1>
      </data>
    </xml>
  </xsl:template>

</xsl:stylesheet>

得到这个输出

<?xml version="1.0" encoding="UTF-8"?>
<xml>
   <data>
      <column1>
&lt;note&gt;
&lt;from&gt;Example&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;XSLT conversion&lt;/body&gt;
&lt;/note&gt;
</column1>
   </data>
</xml>
于 2013-05-13T18:11:41.320 回答