如何加载> &安培;使用xslt2.0进入另一个xml?

时间:2013-05-13 17:44:51

标签: xml xslt xslt-1.0 xslt-2.0

输入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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>