2

私は次の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に変換したいと思います。

<?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>

私は2つの異なる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="/">
    <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"に保存すると機能しないようです。

誰か助けてもらえますか?

ありがとうございました。

新しい情報(編集)

私は今、このように文字列を翻訳しています:

<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を変換するにはどうすればよいですか?

最終解決(編集)

<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>
4

2 に答える 2

2

変数に保存するときに disable-output-escaping="yes" が機能しないようです。

あなたの観察は正しいです。

DOE は、変換の (最終) 結果のシリアル化にのみ影響し、中間ツリーには適用されません

W3C XSLT 1.0 仕様で明示的に述べられている内容は次のとおりです。

" XSLT プロセッサは、結果ツリーの出力方法を制御する場合にのみ、出力エスケープを無効にすることができます。常にそうであるとは限りません。たとえば、結果ツリーは、別の XSLT 変換のソース ツリーとして使用する代わりに、出力。"

値が文字列で、XML ドキュメントのテキスト表現を含む変数を使用しようとする場合も、同じ否定的な答えが当てはまります。

于 2012-08-10T12:28:50.597 に答える