两阶段 XSLT 转换首先将字符串转换为 XML [英] Two phase XSLT transformation converting string to XML first
问题描述
我有以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<string>
<Table>
<Rows>
<Row Id="0">
<Column Name="INS_NAME" XPath="Ins.Name">Jane</Column>
<Column Name="INS_LASTNAME" XPath="Ins.LastName">Smith</Column>
</Row>
<Row Id="1">
<Column Name="INS_NAME" XPath="Ins.Name">Joe</Column>
<Column Name="INS_LASTNAME" XPath="Ins.LastName">Miller</Column>
</Row>
<Row Id="2">
<Column Name="INS_NAME" XPath="Ins.Name">George</Column>
<Column Name="INS_LASTNAME" XPath="Ins.LastName">Ramsey</Column>
</Row>
</Rows>
</Table>
</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">
<?xml version="1.0" encoding="utf-8"?>
<xsl:value-of select="translate(translate(/,'>','>'),'<','<')" />
</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屋!