4

Access 2003 から XML エクスポートを取得し、XSLT を使用してテキスト フィールド (ラテン語...) に CDATA タグを挿入しようとしましたが、XSLT が非常に苦手です...

ここで XML ソース:

    <?xml version="1.0" encoding="UTF-8"?>
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46">
      <export_x005F_xml_message>
       <libelle>h euismod tincidu </libelle>
       <price>300</price>
       <libelle2>h euirci tation ullamc</libelle2>
    </export_x005F_xml_message>
    <export_x005F_xml_message>
      <libelle>h euismod tincidunt ut lao</libelle>
      <price>200</price>
      <libelle2>h euirci tation ullamcorper</libelle2>
   </export_x005F_xml_message>
  </dataroot>

ここで私の XSLT の始まり... :

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml"/>
     <xsl:template match='*[name() = "MESSAGES"]'>
           <xsl:text disable-output-escaping="yes">
             &lt;![CDATA[
           </xsl:text>
           <xsl:copy-of select="./node()"/>
           <xsl:text disable-output-escaping="yes">
             ]]&gt;
            </xsl:text>
     </xsl:template>
    </xsl:stylesheet>

私はそのようなものを手に入れたいです:

    <?xml version="1.0" encoding="UTF-8"?>
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46">
      <export_x005F_xml_message>
       <libelle><![CDATA[h euismod tincidu ]]></libelle>
       <price>300</price>
       <libelle2><![CDATA[h euirci tation ullamc ]]></libelle>
    </export_x005F_xml_message>
    <export_x005F_xml_message>
      <libelle><![CDATA[h euismod tincidunt ut lao ]]></libelle2>
      <price>200</price>
      <libelle2><![CDATA[h euirci tation ullamcorper ]]></libelle2>
   </export_x005F_xml_message>
  </dataroot>

適切な XSLT の作成を手伝ってもらえますか? この XML は、テキスト フィールドに CDATA オプションを提供しない Access 2003 からのものです... 汎用モデルが私のような他の開発者に役立つと確信しています :-)

4

3 に答える 3

3

ここですでに回答されているように: Transform XML with XSLT and preserve CDATA (in Ruby)、より良い答えは xsl:output を使用することです。例えば ​​...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" cdata-section-elements="libelle libelle2" />

<xsl:template match="@*|node()">
 <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2012-07-31T14:18:20.070 に答える
2

この同一性変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"
  cdata-section-elements="libelle libelle2"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合(重大な形式の誤りであったため修正されました):

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd"
 generated="2012-07-31T13:25:46">
    <export_x005F_xml_message>
        <libelle>h euismod tincidu </libelle>
        <price>300</price>
        <libelle2>h euirci tation ullamc</libelle2>
    </export_x005F_xml_message>
    <export_x005F_xml_message>
        <libelle>h euismod tincidunt ut lao</libelle>
        <price>200</price>
        <libelle2>h euirci tation ullamcorper</libelle2>
    </export_x005F_xml_message>
</dataroot>

必要な正しい結果が生成されます

<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd" generated="2012-07-31T13:25:46">
   <export_x005F_xml_message>
      <libelle><![CDATA[h euismod tincidu ]]></libelle>
      <price>300</price>
      <libelle2><![CDATA[h euirci tation ullamc]]></libelle2>
   </export_x005F_xml_message>
   <export_x005F_xml_message>
      <libelle><![CDATA[h euismod tincidunt ut lao]]></libelle>
      <price>200</price>
      <libelle2><![CDATA[h euirci tation ullamcorper]]></libelle2>
   </export_x005F_xml_message>
</dataroot>

説明:

cdata-section-elementsの属性の適切な使用xsl:output

于 2012-07-31T14:21:08.350 に答える
1

私が目にする唯一の問題は、xsl-template の呼び出しです。

次のようになります。

<xsl:template name="MyTemplateName">
    <someTag>
        <xsl:text disable-output-escaping="yes">
                    &lt;![CDATA[
            </xsl:text>

        <someOtherTag/>

        <xsl:text disable-output-escaping="yes">
                 ]]&gt;
            </xsl:text>
    </someTag>
</xsl:template>

したがって、テンプレートは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="MESSAGES%20old.xsd">

<xsl:template match="/">
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata"  generated="2012-07-31T13:25:46">
    <xsl:apply-templates select="export_x005F_xml_message"/>
    </dataroot>
</xsl:template>

<xsl:template match="export_x005F_xml_message">
    <export_x005F_xml_message>
        <libelle>
        <xsl:text disable-output-escaping="yes">
         &lt;![CDATA[
       </xsl:text>
            <xsl:value-of select="libelle"/>
        </libelle>
        <xsl:text disable-output-escaping="yes">
        ]]&gt;
       </xsl:text>
       ...
    </export_x005F_xml_message>
</xsl:template>

</xsl:stylesheet>
于 2012-07-31T14:13:18.063 に答える