0

これは単なる情報共有です。私はすでに解決策を知っています:)私はそれを難し​​い方法でやりました!! ここで 2 つのことが必要です。

  1. これまでに到達したことを共有します。
  2. 誰かがより良い解決策を持っているかどうかを知る
4

2 に答える 2

1

ソース XML がないとわかりにくいです。しかし、一度要件があり、再帰テンプレートを使用しました。

私の入力XMLは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Order>
<Item>
    <RECORD_ID>RECORD_ID</RECORD_ID>
    <ENTITY_CODE>ENTITY_CODE</ENTITY_CODE>
    <USER_CODE>USER_CODE</USER_CODE>
    <RECORD_DATE>RECORD_DATE</RECORD_DATE>
    <ITEM_CODE>ITEM_CODE</ITEM_CODE>
    <LINE_QUANTITY>LINE_QUANTITY</LINE_QUANTITY>
    <LINE_PRICE>LINE_PRICE</LINE_PRICE>
    <LINE_DISCOUNT_PERCENT>LINE_DISCOUNT PERCENT</LINE_DISCOUNT_PERCENT>
    <HEADER_SPECIAL_INSTRUCTIONS>HEADER_SPECIAL_INSTRUCTIONS</HEADER_SPECIAL_INSTRUCTIONS>
</Item>
<Item>
    <RECORD_ID>1850</RECORD_ID>
    <ENTITY_CODE>I65647</ENTITY_CODE>
    <USER_CODE>135</USER_CODE>
    <RECORD_DATE>2011-05-27</RECORD_DATE>
    <ITEM_CODE>798159</ITEM_CODE>
    <LINE_QUANTITY>1</LINE_QUANTITY>
    <HEADER_SPECIAL_INSTRUCTIONS>HEADER_SPECIAL_INSTRUCTIONS HEADER_SPECIAL_INSTRUCTIONS HEADER_SPECIAL_INSTRUCTIONS HEADER_SPECIAL_INSTRUCTIONS</HEADER_SPECIAL_INSTRUCTIONS>
</Item>
</Order>

特別な指示テキストを分割する必要がありましたが、<Item>要素が 1 を超える場合のみです。そのため、次のテンプレートを思いつきました。

    <xsl:template name="Texts">
    <xsl:param name="string" select="Item[2]/HEADER_SPECIAL_INSTRUCTIONS" />
    <xsl:param name="line-length" select="70"/>
    <xsl:variable name="line" select="substring($string,1,$line-length)"/>
    <xsl:variable name="rest" select="substring($string, $line-length+1)"/>
    <xsl:if test="$line">
        <E1EDKT2 SEGMENT="1">
            <TDLINE> 
                <xsl:value-of select="$line"/>
            </TDLINE> 
            <TDFORMAT>*</TDFORMAT> 
        </E1EDKT2>
    </xsl:if>
    <xsl:if test="$rest">
        <xsl:call-template name="Texts">
            <xsl:with-param name="string" select="$rest"/>
            <xsl:with-param name="line-length" select="$line-length"/>
        </xsl:call-template>
    </xsl:if>   
</xsl:template>

そのテンプレートの XML 出力は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<E1EDKT1 SEGMENT="1">
<TDID>ZA01</TDID>
<E1EDKT2 SEGMENT="1">
    <TDLINE>HEADER_SPECIAL_INSTRUCTIONS HEADER_SPECIAL_INSTRUCTIONS
        HEADER_SPECIAL</TDLINE>
    <TDFORMAT>*</TDFORMAT>
</E1EDKT2>
<E1EDKT2 SEGMENT="1">
    <TDLINE>_INSTRUCTIONS HEADER_SPECIAL_INSTRUCTIONS</TDLINE>
    <TDFORMAT>*</TDFORMAT>
</E1EDKT2>
</E1EDKT1>

私はあなたのソース XML を知らないので (少なくとも代表的な小さなバージョンを常に提供する必要があります)、あなたの XSLT を修正することはできません。ただし、私のテンプレートをニーズに合わせて調整してください。

于 2012-11-29T11:43:34.683 に答える
0
<xsl:template name="break-to-length">
    <xsl:param name="text" />
    <xsl:param name="length" />
    
    <xsl:variable name="first-half" select="substring($text,0,$length)" />
    <xsl:variable name="second-half" select="substring-after($text, $first-half)" />
    
    <xsl:variable name="last-five-chars-of-first-half" select="substring-after($first-half,substring($first-half, 0, $length - 5))" />
    
    <xsl:variable name="alternative-first-half">
        <xsl:choose>
            <xsl:when test="contains($last-five-chars-of-first-half, $space)">
                <xsl:value-of select="concat(substring($first-half, 0, $length - 5), substring-before($last-five-chars-of-first-half, $space))" />
            </xsl:when>
            <xsl:when test="contains($last-five-chars-of-first-half, $dot)">
                <xsl:value-of select="concat(substring($first-half, 0, $length - 5), substring-before($last-five-chars-of-first-half, $dot), $dot)" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$first-half" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    
    <xsl:variable name="alternative-second-half">
        <xsl:choose>
            <xsl:when test="contains($last-five-chars-of-first-half, $space)">
                <xsl:value-of select="concat(substring-after($last-five-chars-of-first-half, $space), $second-half)" />
            </xsl:when>
            <xsl:when test="contains($last-five-chars-of-first-half, $dot)">
                <xsl:value-of select="concat(substring-after($last-five-chars-of-first-half, $dot), $second-half)" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$second-half" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    
    <!-- if first half doesn't end with a space or dot -->
    <xsl:variable name="word-was-cut" select="$alternative-first-half = $first-half" />
    
    <xsl:value-of select="$alternative-first-half" />
    
    <xsl:choose>
        <xsl:when test="string-length($alternative-second-half) = 0">
            <!-- Do Nothing -->
        </xsl:when>
        <xsl:when test="string-length($alternative-second-half) &lt; $length">
            <!-- if first half doesn't end with a space or dot -->
            <xsl:if test="$word-was-cut">
                <xsl:text>-</xsl:text>
            </xsl:if>
            <fo:block />
            <xsl:value-of select="$alternative-second-half" />
        </xsl:when>
        <xsl:otherwise>
            <!-- Second half is longer than max length -->
            <!-- if first half doesn't end with a space -->
            <xsl:if test="$word-was-cut">
                <xsl:text>-</xsl:text>
            </xsl:if>
            <fo:block />
            <xsl:call-template name="break-to-length">
                <xsl:with-param name="text" select="$alternative-second-half"/>
                <xsl:with-param name="length" select="$length" />
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
于 2012-11-29T11:00:09.743 に答える