0

こんにちは、XSLT を使用して入力 XML を出力 XML に変換し、一部の要素だけの改行とインデントを削除することに関連する質問があります。

私の質問を説明したいと思います:

入力:

<LISTESTOF>
  <ICSGROUP>
    <ICSNUM>1</ICSNUM>
    <ICSDKNAME>A1</ICSDKNAME>
    <ICSUKNAME>B2</ICSUKNAME>
  </ICSGROUP>
  <ICSGROUP>
    <ICSNUM>2</ICSNUM>
    <ICSDKNAME>B1</ICSDKNAME>
    <ICSUKNAME>B2</ICSUKNAME>
  </ICSGROUP>
</LISTESTOF>

出力:

<LISTESTOF>
<ICSGROUP><ICSNUM>1</ICSNUM>
<ICSDKNAME>A1</ICSDKNAME>
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP>
<ICSGROUP><ICSNUM>2</ICSNUM>
<ICSDKNAME>B1</ICSDKNAME>
<ICSUKNAME>B2</ICSUKNAME></ICSGROUP>
</LISTESTOF>

これまでの私の XSLT ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="LISTESTOF">
             <xsl:value-of select="'&#xA;'" /><LISTESTOF><xsl:apply-templates select="ICSGROUP"/></LISTESTOF>
    </xsl:template>

    <xsl:template match="ICSGROUP">
              <xsl:value-of select="'&#xA;'" /><ICSGROUP><xsl:apply-templates select="ICSNUM"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSDKNAME"/><xsl:value-of select="'&#xA;'" /><xsl:apply-templates select="ICSUKNAME"/></ICSGROUP>
    </xsl:template>

    <xsl:template match="ICSNUM">
        <ICSNUM><xsl:value-of select="."/></ICSNUM>
    </xsl:template>

    <xsl:template match="ICSDKNAME">
        <ICSDKNAME><xsl:value-of select="."/></ICSDKNAME>
    </xsl:template>

    <xsl:template match="ICSUKNAME">
        <ICSUKNAME><xsl:value-of select="."/></ICSUKNAME>
    </xsl:template>


    </xsl:stylesheet>

よりクリーンなソリューションはありますか?定義されていない要素はどうなりますか? 彼らは消えますか?助言がありますか?前もって感謝します!

4

1 に答える 1

3

空白のみのテキストノードをすべて削除することから始めます

<xsl:strip-space elements="*"/>

次に、特に指定がない限り、(空白を取り除いた後) 入力から出力まですべてを変更せずにコピーする ID テンプレートを用意します。

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

改行をに置きたい要素に特定のテンプレートを追加します

<xsl:template match="ICSGROUP|ICSDKNAME|ICSUKNAME">
  <xsl:text>&#xa;</xsl:text>
  <xsl:call-template name="ident"/>
</xsl:template>

そしてLISTESTOF、終了タグの前に余分な改行を追加するための特別なもの

<xsl:template match="LISTESTOF">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:copy>
</xsl:template>
于 2013-10-26T19:57:25.800 に答える