强制空CDATA元素(Forcing Empty CDATA Elements)

2019-10-17 20:59发布

如果我可以通过使用XSL(1.0),但保持CDATA元素即使在没有任何内容转换XML我提出了质疑。 由于XSL初学者我被这个问题压倒一点点......

这里是一个简单的示例。

我有的

<AMOUNT/>

我想要的是

<AMOUNT><![CDATA[]]></AMOUNT>
  • 有没有办法迫使空CDATA段没有内容?
  • 有没有办法做到这一点在文件中的所有元素?
  • 有没有办法做到这一点只在CDATA段元素的呢?

(看看量元素)

这里是我的示例XML

<?xml version="1.0" encoding="iso-8859-1" ?>
    <Artikel>
        <Temp>
            <Zeile>107</Zeile>
            <Artikelzubehoerdaten>
                <Artikelzubehoerdaten>
                    <ZubehoerID>18</ZubehoerID>
                    <Mandant>88</Mandant>
                    <UrsprungsArt>1</UrsprungsArt>
                    <Ursprungsnummer>99100091</Ursprungsnummer>
                    <UrsprungsAuspraegungID>0</UrsprungsAuspraegungID>
                    <ZubehoerArt>1</ZubehoerArt>
                    <Zubehoernummer>00500041</Zubehoernummer>
                    <ZubehoerAuspraegungID>0</ZubehoerAuspraegungID>
                    <Automatisch>0</Automatisch>
                    <Mengenberechnung>1</Mengenberechnung>
                    <MengenFaktor>1.0000</MengenFaktor>
                    <Basismengeneinheit>Stk</Basismengeneinheit>
                    <Preisgrundlagen>2</Preisgrundlagen>
                    <ManuellerPreis>0.0000</ManuellerPreis>
                    <PreislisteID>0</PreislisteID>
                    <Timestamp>AAAAAAAEbVw=</Timestamp>
                    <Gruppendaten/>
                </Artikelzubehoerdaten>
                <Artikelzubehoerdaten>
                    <ZubehoerID>19</ZubehoerID>
                    <Mandant>88</Mandant>
                    <UrsprungsArt>1</UrsprungsArt>
                    <Ursprungsnummer>99100091</Ursprungsnummer>
                    <UrsprungsAuspraegungID>0</UrsprungsAuspraegungID>
                    <ZubehoerArt>2</ZubehoerArt>
                    <Zubehoernummer>100</Zubehoernummer>
                    <Automatisch>0</Automatisch>
                    <Mengenberechnung>0</Mengenberechnung>
                    <MengenFaktor>0.0000</MengenFaktor>
                    <Preisgrundlagen>0</Preisgrundlagen>
                    <ManuellerPreis>0.0000</ManuellerPreis>
                    <PreislisteID>0</PreislisteID>
                    <Timestamp>AAAAAAAEbWA=</Timestamp>
                    <Gruppendaten>
                        <ZubehoerID>1</ZubehoerID>
                        <Mandant>88</Mandant>
                        <UrsprungsArt>2</UrsprungsArt>
                        <Ursprungsnummer>100</Ursprungsnummer>
                        <ZubehoerArt>1</ZubehoerArt>
                        <Zubehoernummer>10300003</Zubehoernummer>
                        <ZubehoerAuspraegungID>0</ZubehoerAuspraegungID>
                        <Automatisch>0</Automatisch>
                        <Mengenberechnung>2</Mengenberechnung>
                        <MengenFaktor>1.0000</MengenFaktor>
                        <Basismengeneinheit>Stk</Basismengeneinheit>
                        <Preisgrundlagen>2</Preisgrundlagen>
                        <ManuellerPreis>0.0000</ManuellerPreis>
                        <PreislisteID>0</PreislisteID>
                        <Timestamp>AAAAAAABuBI=</Timestamp>
                    </Gruppendaten>
                    <Gruppendaten>
                        <ZubehoerID>2</ZubehoerID>
                        <Mandant>88</Mandant>
                        <UrsprungsArt>2</UrsprungsArt>
                        <Ursprungsnummer>100</Ursprungsnummer>
                        <ZubehoerArt>1</ZubehoerArt>
                        <Zubehoernummer>10300001</Zubehoernummer>
                        <ZubehoerAuspraegungID>0</ZubehoerAuspraegungID>
                        <Automatisch>0</Automatisch>
                        <Mengenberechnung>2</Mengenberechnung>
                        <MengenFaktor>1.0000</MengenFaktor>
                        <Basismengeneinheit>Stk</Basismengeneinheit>
                        <Preisgrundlagen>2</Preisgrundlagen>
                        <ManuellerPreis>0.0000</ManuellerPreis>
                        <PreislisteID>0</PreislisteID>
                        <Timestamp>AAAAAAABuBM=</Timestamp>
                    </Gruppendaten>
                    <Gruppendaten>
                        <ZubehoerID>3</ZubehoerID>
                        <Mandant>88</Mandant>
                        <UrsprungsArt>2</UrsprungsArt>
                        <Ursprungsnummer>100</Ursprungsnummer>
                        <ZubehoerArt>1</ZubehoerArt>
                        <Zubehoernummer>10300002</Zubehoernummer>
                        <ZubehoerAuspraegungID>0</ZubehoerAuspraegungID>
                        <Automatisch>0</Automatisch>
                        <Mengenberechnung>2</Mengenberechnung>
                        <MengenFaktor>1.0000</MengenFaktor>
                        <Basismengeneinheit>Stk</Basismengeneinheit>
                        <Preisgrundlagen>2</Preisgrundlagen>
                        <ManuellerPreis>0.0000</ManuellerPreis>
                        <PreislisteID>0</PreislisteID>
                        <Timestamp>AAAAAAABuBQ=</Timestamp>
                    </Gruppendaten>
                </Artikelzubehoerdaten>
                <Artikelzubehoerdaten>
                    <ZubehoerID>21</ZubehoerID>
                    <Mandant>88</Mandant>
                    <UrsprungsArt>1</UrsprungsArt>
                    <Ursprungsnummer>99100091</Ursprungsnummer>
                    <UrsprungsAuspraegungID>0</UrsprungsAuspraegungID>
                    <ZubehoerArt>2</ZubehoerArt>
                    <Zubehoernummer>200</Zubehoernummer>
                    <Automatisch>0</Automatisch>
                    <Mengenberechnung>0</Mengenberechnung>
                    <MengenFaktor>0.0000</MengenFaktor>
                    <Preisgrundlagen>0</Preisgrundlagen>
                    <ManuellerPreis>0.0000</ManuellerPreis>
                    <PreislisteID>0</PreislisteID>
                    <Timestamp>AAAAAAAEk3U=</Timestamp>
                    <Gruppendaten>
                        <ZubehoerID>20</ZubehoerID>
                        <Mandant>88</Mandant>
                        <UrsprungsArt>2</UrsprungsArt>
                        <Ursprungsnummer>200</Ursprungsnummer>
                        <ZubehoerArt>1</ZubehoerArt>
                        <Zubehoernummer>00200050</Zubehoernummer>
                        <ZubehoerAuspraegungID>0</ZubehoerAuspraegungID>
                        <Automatisch>0</Automatisch>
                        <Mengenberechnung>1</Mengenberechnung>
                        <MengenFaktor>1.0000</MengenFaktor>
                        <Basismengeneinheit>Stk</Basismengeneinheit>
                        <Preisgrundlagen>2</Preisgrundlagen>
                        <ManuellerPreis>0.0000</ManuellerPreis>
                        <PreislisteID>0</PreislisteID>
                        <Timestamp>AAAAAAAEk3I=</Timestamp>
                    </Gruppendaten>
                </Artikelzubehoerdaten>
            </Artikelzubehoerdaten>
        </Temp>
    </Artikel>

这里是我的示例XSL

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes" cdata-section-elements ="ARTICLE AUTO AMOUNT GROUP_NUMBER"/>
    <xsl:template match="/">
        <ARTICLE_LIST>
            <xsl:for-each select="Artikel/Temp">    
                <ARTICLE>
                    <CROSS_SELLINGS>
                        <xsl:for-each select="Artikelzubehoerdaten/Artikelzubehoerdaten[ZubehoerArt=1]">
                            <CROSS_SELLING>
                                <ARTICLE><xsl:value-of select="Zubehoernummer"/></ARTICLE>
                                <AUTO><xsl:value-of select="Automatisch"/></AUTO>
                                <GROUP_NUMBER></GROUP_NUMBER>
                                <AMOUNT><xsl:value-of select="MengenFaktor"/></AMOUNT>
                            </CROSS_SELLING>
                        </xsl:for-each>
                        <xsl:for-each select="Artikelzubehoerdaten/Artikelzubehoerdaten[ZubehoerArt=2]">
                            <xsl:for-each select="Gruppendaten">
                                <CROSS_SELLING>
                                    <ARTICLE><xsl:value-of select="Zubehoernummer"/></ARTICLE>
                                    <AUTO><xsl:value-of select="Automatisch"/></AUTO>
                                    <GROUP_NUMBER><xsl:value-of select="Ursprungsnummer"/></GROUP_NUMBER>
                                    <AMOUNT></AMOUNT>
                                </CROSS_SELLING>
                            </xsl:for-each>
                        </xsl:for-each>
                    </CROSS_SELLINGS>
                </ARTICLE>
            </xsl:for-each>
        </ARTICLE_LIST>
    </xsl:template>

</xsl:stylesheet>

这里是实际输出

<?xml version="1.0" encoding="iso-8859-1"?>
<ARTICLE_LIST>
   <ARTICLE>
      <CROSS_SELLINGS>
         <CROSS_SELLING>
            <ARTICLE><![CDATA[00500041]]></ARTICLE>
            <AUTO><![CDATA[0]]></AUTO>
            <GROUP_NUMBER/>
            <AMOUNT><![CDATA[1.0000]]></AMOUNT>
         </CROSS_SELLING>
         <CROSS_SELLING>
            <ARTICLE><![CDATA[10300003]]></ARTICLE>
            <AUTO><![CDATA[0]]></AUTO>
            <GROUP_NUMBER><![CDATA[100]]></GROUP_NUMBER>
            <AMOUNT/>
         </CROSS_SELLING>
         <CROSS_SELLING>
            <ARTICLE><![CDATA[10300001]]></ARTICLE>
            <AUTO><![CDATA[0]]></AUTO>
            <GROUP_NUMBER><![CDATA[100]]></GROUP_NUMBER>
            <AMOUNT/>
         </CROSS_SELLING>
         <CROSS_SELLING>
            <ARTICLE><![CDATA[10300002]]></ARTICLE>
            <AUTO><![CDATA[0]]></AUTO>
            <GROUP_NUMBER><![CDATA[100]]></GROUP_NUMBER>
            <AMOUNT/>
         </CROSS_SELLING>
         <CROSS_SELLING>
            <ARTICLE><![CDATA[00200050]]></ARTICLE>
            <AUTO><![CDATA[0]]></AUTO>
            <GROUP_NUMBER><![CDATA[200]]></GROUP_NUMBER>
            <AMOUNT/>
         </CROSS_SELLING>
      </CROSS_SELLINGS>
   </ARTICLE>
</ARTICLE_LIST>

(这些只是真实文件的切口)

Answer 1:

要强制一个空的CDATA部分,你可以这样做:

<xsl:template name="empty-cdata">
  <xsl:text disable-output-escaping="yes"><![CDATA[]]></xsl:text>
</xsl:template>

如果您不知道是否为空值或没有,你可以使用条件:

<xsl:choose>
  <xsl:when test="string-length(.)">
    <xsl:value-of select="."/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:call-template name="empty-cdata"/>
  </xsl:otherwise>
</xsl:choose>

然后你可以换一个模板:

<xsl:template name="cdata-value-of">
  <xsl:param name="value"/>
  <xsl:choose>
    <xsl:when test="string-length($value)">
      <!-- let cdata-section-elements take care of wrapping
           in a CDATA section if needed. Otherwise you will
           need to do string-replacement of ']]>' yourself. -->
      <xsl:value-of select="$value"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="empty-cdata"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

然后你使用像这样:

<AMOUNT>
  <xsl:call-template name="cdata-value-of">
    <xsl:with-param name="value" select="MengenFaktor"/>
  </xsl:call-template>
</AMOUNT>

但同样, 应该不需要空CDATA部分 --honestly没有必要对任何CDATA部分文件在所有的任何地方! 你怎么看呢大大复杂文档的生产和消费,并增加文件大小(你的情况),即使文档的XML信息集是完全一样的。

此外,请记住,你不能使用CDATA节属性值中的,所以一定要确保你从来不使用cdata-value-ofempty-cdata生成属性值或你的XML可能不能很好地形成!



文章来源: Forcing Empty CDATA Elements