【问题标题】:CDATA with XSLT does not appear没有出现带有 XSLT 的 CDATA
【发布时间】:2012-12-19 20:39:03
【问题描述】:

我有一个包含以下信息的 xml 文件:

  <infAdic>
   <infAdFisco>IMUNIDADE ICMS CONF. ART.155 DA CONST. FEDERAL-LUB.     DERIVADO</infAdFisco> 
    <infCpl>
      Preco sujeito alteracao. - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao)      adequadamente acondicionado(s) para suportar os riscosnormais de carregamento,     descarregamento, transbordo e transporte (Letra C do Item II, de Artigo 22, do Decreto N.96044/88) 
       <![CDATA[ <fabEntrega>Codi</fabEntrega>]]> 
        PO. number: Teste NFe 13122012 
    </infCpl>
    <obsCont xCampo="DOCNUM">
      <xTexto>0006703134</xTexto> 
    </obsCont>
    <obsCont xCampo="emailDestinatarioNFe">
      <xTexto>xxxxx@xxxx.com</xTexto> 
    </obsCont>
    <obsCont xCampo="idAplic">
    <xTexto>LUBES</xTexto> 
    </obsCont>
 </infAdic>

但是当我用下面的 xlst programa 执行上面的 xml 文件时

 <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nfe="http://www.portalfiscal.inf.br/nfe">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" cdata-section-elements="nfe:infCpl"/>
<xsl:template match="/nfe:enviNFe">
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
        <soap12:Header>
            <nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2">
                <cUF>
                    <xsl:value-of select="nfe:NFe[1]/nfe:infNFe/nfe:ide/nfe:cUF"/>
                </cUF>
                <versaoDados>
                    <xsl:value-of select="@versao"/>
                </versaoDados>
            </nfeCabecMsg>
        </soap12:Header>
        <soap12:Body>
            <nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2">
                    <enviNFe xmlns="http://www.portalfiscal.inf.br/nfe">
                        <xsl:attribute name="versao"><xsl:value-of select="@versao"/></xsl:attribute>
                        <xsl:copy-of select="nfe:idLote"/>
                        <xsl:for-each select="nfe:NFe">
                            <xsl:text disable-output-escaping="yes"><![CDATA[<NFe xmlns="http://www.portalfiscal.inf.br/nfe">]]></xsl:text>
                            <xsl:copy-of select="*"/>
                            <xsl:text disable-output-escaping="yes"><![CDATA[</NFe>]]></xsl:text>
                        </xsl:for-each>
                    </enviNFe>
            </nfeDadosMsg>
        </soap12:Body>
    </soap12:Envelope>
 </xsl:template>
</xsl:stylesheet>

我看不到带有 CDATA 信息的 infCpl 字段。 这是我看到的结果:

 <infCpl>
     Preco sujeito alteracao. - O(s) produto(s) objeto(s) desta Nota Fiscal esta      (ao) adequadamente acondicionado(s) para suportar os riscosnormais de    carregamento,      descarregamento, transbordo e transporte (Letra C do Item II, de         Artigo     22, do Decreto N.96044/88) 
    <fabEntrega>Codi</fabEntrega> 
      PO. number: Teste NFe 13122012 
 </infCpl>

你能帮我吗,因为我想要下面的结果?

 <infCpl>
    Preco sujeito alteracao. - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao)      adequadamente acondicionado(s) para suportar os riscosnormais de carregamento,     descarregamento, transbordo e transporte (Letra C do Item II, de Artigo     22, do Decreto N.96044/88) 
     <![CDATA[ <fabEntrega>Codi</fabEntrega>]]> 
  PO. number: Teste NFe 13122012 
 </infCpl>

问候, 塞尔吉奥·萨洛芒

【问题讨论】:

    标签: xslt cdata


    【解决方案1】:

    如果您确定 infCpl 将只包含 CDATA 而不是混合内容(元素和 CDATA),您可以在 xsl:output 中将 infCpl 指定为 cdata-section-element

    <xsl:output indent="yes" cdata-section-elements="infCpl"/>
    

    示例...

    XML 输入

    <infAdic>
        <infAdFisco>IMUNIDADE ICMS CONF. ART.155 DA CONST. FEDERAL-LUB.     DERIVADO</infAdFisco> 
        <infCpl>
            Preco &amp; &gt; &lt; &apos; &quot; sujeito alteracao. - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao)      adequadamente acondicionado(s) para suportar os riscosnormais de carregamento,     descarregamento, transbordo e transporte (Letra C do Item II, de Artigo 22, do Decreto N.96044/88) 
            <![CDATA[ <fabEntrega>Codi</fabEntrega>]]> 
            PO. number: Teste NFe 13122012 
        </infCpl>
        <obsCont xCampo="DOCNUM">
            <xTexto>0006703134</xTexto> 
        </obsCont>
        <obsCont xCampo="emailDestinatarioNFe">
            <xTexto>xxxxx@xxxx.com</xTexto> 
        </obsCont>
        <obsCont xCampo="idAplic">
            <xTexto>LUBES</xTexto> 
        </obsCont>
    </infAdic>
    

    XSLT 2.0

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes" cdata-section-elements="infCpl"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    

    XML 输出

    <infAdic>
       <infAdFisco>IMUNIDADE ICMS CONF. ART.155 DA CONST. FEDERAL-LUB.     DERIVADO</infAdFisco>
       <infCpl><![CDATA[
            Preco & > < ' " sujeito alteracao. - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao)      adequadamente acondicionado(s) para suportar os riscosnormais de carregamento,     descarregamento, transbordo e transporte (Letra C do Item II, de Artigo 22, do Decreto N.96044/88) 
             <fabEntrega>Codi</fabEntrega> 
            PO. number: Teste NFe 13122012 
        ]]></infCpl>
       <obsCont xCampo="DOCNUM">
          <xTexto>0006703134</xTexto>
       </obsCont>
       <obsCont xCampo="emailDestinatarioNFe">
          <xTexto>xxxxx@xxxx.com</xTexto>
       </obsCont>
       <obsCont xCampo="idAplic">
          <xTexto>LUBES</xTexto>
       </obsCont>
    </infAdic>
    

    【讨论】:

    • 嗨,Daniel,infCpl 字段将混合文本和 CDATA。你能有别的选择吗?问候,
    • @user1916896 - text 和 CDATA 一起很好(它们真的是一回事)所以我的回答应该适合你。甚至像 &amp;amp; 这样的实体引用也会在 cdata 部分中以文字字符 (&amp;) 结束。 (我将更新示例。)
    • 嗨丹尼尔,如果我使用您告知的代码,我会看到如下所示的 infCpl 字段? Preco sujeito alteracao。 - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao) adequadamente acondicionado(s) para suportar os riscosnormais de carregamento, descarregamento, transbordo e transporte (Letra C do Item II, de Artigo 22, do Decreto N.96044/88) Codi]]> PO。编号:Teste NFe 13122012
    • @user1916896 - 不,您会看到它就像我的示例中的输出一样。 infCpl 的所有内容都将包装在 CDATA 中,但这没关系,相当于您评论中的 infCpl
    • 嗨丹尼尔,我想看到一个文本和 CDATA 混合但未包装。我想要这个结果:infCpl> Preco sujeito alteracao。 - O(s) produto(s) objeto(s) desta Nota Fiscal esta(ao) adequadamente acondicionado(s) para suportar os riscosnormais de carregamento, descarregamento, transbordo e transporte (Letra C do Item II, de Artigo 22, do Decreto N.96044/88) Codi]]> PO。编号:Teste NFe 13122012 你能帮帮我吗?
    【解决方案2】:

    XML 中的 CDATA 不是为携带信息而设计的。您不应该关心输入中的 CDATA 边界。如果您确实关心它们,那么您需要不同的工具 - XSLT 假定 CDATA 只是一种创作便利,而不是一种与文档接收者交流信息的方式。

    但是,如果您无法处理 CDATA 以这种方式被滥用的 XML,那么您可以查看 Andrew Welch 的 LexEv 工具,该工具捆绑在 KernowForSaxon 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      相关资源
      最近更新 更多