两阶段 XSLT 转换首先将字符串转换为 XML [英] Two phase XSLT transformation converting string to XML first

查看:22
本文介绍了两阶段 XSLT 转换首先将字符串转换为 XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<string>
&lt;Table&gt;
&lt;Rows&gt;
&lt;Row Id="0"&gt;
&lt;Column Name="INS_NAME" XPath="Ins.Name"&gt;Jane&lt;/Column&gt;
&lt;Column Name="INS_LASTNAME" XPath="Ins.LastName"&gt;Smith&lt;/Column&gt;
&lt;/Row&gt;
&lt;Row Id="1"&gt;
&lt;Column Name="INS_NAME" XPath="Ins.Name"&gt;Joe&lt;/Column&gt;
&lt;Column Name="INS_LASTNAME" XPath="Ins.LastName"&gt;Miller&lt;/Column&gt;
&lt;/Row&gt;
&lt;Row Id="2"&gt;
&lt;Column Name="INS_NAME" XPath="Ins.Name"&gt;George&lt;/Column&gt;
&lt;Column Name="INS_LASTNAME" XPath="Ins.LastName"&gt;Ramsey&lt;/Column&gt;
&lt;/Row&gt;
&lt;/Rows&gt;
&lt;/Table&gt;
</string>

并且我想使用 单个 XSLT 将其转换为这个 XML:

and I would like to transform it to this XML using a single XSLT:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer><Name>Jane</Name><LastName>Smith</LastName></Customer>
  <Customer><Name>Joe</Name><LastName>Miller</LastName></Customer>
  <Customer><Name>George</Name><LastName>Ramsey</LastName></Customer>
</Customers>

我可以用两种不同的 XSLT 来实现:

I can do it with two different XSLT's:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:value-of select="/" disable-output-escaping="yes" />
  </xsl:template>
</xsl:stylesheet>

然后:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <Customers>
      <xsl:for-each select="Table/Rows/Row">
      <Customer>
        <Name><xsl:value-of select="Column[@Name='INS_NAME']" /></Name>
        <LastName><xsl:value-of select="Column[@Name='INS_LASTNAME']" /></LastName>
      </Customer>
      </xsl:for-each>
    </Customers>
  </xsl:template>
</xsl:stylesheet>

我一直在阅读有关多相变换的文章,但似乎无法理解.我曾尝试将第一个 XSLT 保存在变量中,但似乎 disable-output-escaping="yes" 在保存到变量时不起作用.

I have been reading about multi phase transformations but I can't seem to get it. I have tried saving the first XSLT in a variable but it seems disable-output-escaping="yes" does not work when saving to a variable.

有人可以帮忙吗?

谢谢.

新信息(编辑)

我现在以这种方式翻译字符串:

I am now translating the string this way:

<xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:variable name="stringXml">
      &lt;?xml version="1.0" encoding="utf-8"?&gt;
      <xsl:value-of select="translate(translate(/,'&gt;','&gt;'),'&lt;','&lt;')" />
    </xsl:variable>
...

如何对存储在 stringXML 中的结果 XML 进行转换?

How can I do a transformation on the resulting XML stored in stringXML?

最终解决方案(编辑)

<msxml:script implements-prefix="myLib" language="C#">
<msxml:assembly name="System.Web"/>
<msxml:using namespace="System.Web"/>
<![CDATA[
public System.Xml.XPath.XPathNodeIterator convertText(string text)
{
XmlDocument doc = new XmlDocument();
      doc.PreserveWhitespace = true;
      doc.LoadXml(text);
      return doc.CreateNavigator().Select("/");
}
]]>
</msxml:script>

推荐答案

似乎disable-output-escaping="yes" 在保存到变量.

it seems disable-output-escaping="yes" does not work when saving to a variable.

你的观察是正确的.

DOE 仅影响转换的(最终)结果的序列化,不适用于中间树.

这里是 W3C XSLT 1.0规范明确指出:

Here is what the W3C XSLT 1.0 specification explicitly says:

"XSLT 处理器只有在以下情况下才能禁用输出转义控制结果树的输出方式.这可能并不总是案件.例如,结果树可以用作源树另一个 XSLT 转换而不是输出."

同样的否定答案适用于尝试使用一个变量,其值为一个字符串,包含 XML 文档的文本表示.

The same negative answer holds for trying to use a variable, whose value is a string, containing a textual representation of an XML document.

这篇关于两阶段 XSLT 转换首先将字符串转换为 XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆