2

xsl(1.0)を使用してxmlを変換できるかどうか、ただしコンテンツが含まれていない場合でもCDATA要素を保持できるかどうかを質問されました。xslの初心者として、私はその質問に少し圧倒されています...

これが簡単なサンプルです。

私が持っているもの

<AMOUNT/>

私が欲しいもの

<AMOUNT><![CDATA[]]></AMOUNT>
  • コンテンツのない空のcdataセグメントを強制する方法はありますか?
  • ファイル内のすべての要素に対してそれを行う方法はありますか?
  • cdata-section-elementsにあるものだけのためにそれを行う方法はありますか?

(AMOUNT要素を見てください)

これが私のサンプル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>

(これらは実際のファイルの切り抜きです)

4

1 に答える 1

5

空の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セクションは必要ありません。正直なところ、ドキュメント内のどこにもCDATAセクションは必要ありません。ドキュメントのXMLインフォセットがまったく同じであっても、ドキュメントの作成と消費が大幅に複雑になり、ドキュメントのサイズが大きくなることがわかります(あなたの場合)。

また、属性値内でCDATAセクションを使用することはできないため、属性値を使用cdata-value-ofまたはempty-cdata生成しないようにしてください。そうしないと、XMLが整形式にならない可能性があります。

于 2013-03-23T11:47:15.577 に答える