2

与えられたノード、例えば。

<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="SP" elem8="MC" elem9="DS" elem10="DA" elem11="16"/>

属性が「DA」の場合は出力を「DA」にする必要があり、属性が「BA」の場合は次の属性の値にする必要があります(つまり、elem7 = "BA elem8 ="03"の場合は"03"出力が必要です)

複数の一致の危険性はないため、属性が「BA」の場合、「DA」属性はありませんが、値はどの要素でも発生する可能性があります

attribute :: tagを調べましたが、これが私のニーズを満たすかどうかはわかりません。

どんな助けでも大歓迎

4

2 に答える 2

3

私はあなたの属性がelemNの形式の名前を持っていると仮定しました。ここでN=1,2,3 ...、そしてそれらはそれに応じて順序付けられます。

次のXSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="text" />
    <xsl:template match="/SI">
        <xsl:choose>
            <xsl:when test="some $i in @* satisfies $i='DA'">
                <xsl:text>DA</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="attr" select="concat('elem', xs:decimal(substring-after(@*[.='BA']/name(), 'elem')) + 1)" />
                <xsl:value-of select="@*[name() = $attr]" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

次の入力XMLに適用されます。

<?xml version="1.0" encoding="UTF-8"?>
<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="SP" elem8="MC" elem9="DS" elem10="DA" elem11="16" />

出力として与えDAます。

そして、次のXMLに適用されます。

<?xml version="1.0" encoding="UTF-8"?>
<SI elem1="TI" elem2="FN" elem3="4099450222" elem4="TM" elem5="4094110000" elem6="MT" elem7="BA" elem8="03" elem9="DS" elem10="DAs" elem11="16" />

出力として与え03ます。

編集

XSLT 1.0バージョン(Altova XMLSpyでテスト済み)は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:apply-templates select="SI/@*" />
    </xsl:template>

    <xsl:template match="@*">
        <xsl:choose>
        <xsl:when test=". = 'DA'">
            <xsl:text>DA</xsl:text>     
        </xsl:when>
        <xsl:when test=".='BA'">
            <xsl:variable name="attr" select="concat('elem', substring-after(name(), 'elem') + 1)" />
            <xsl:value-of select="/SI/@*[name() = $attr]" />
        </xsl:when>
        <xsl:otherwise/>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
于 2012-06-14T11:22:46.487 に答える
2

属性が「DA」の場合は出力を「DA」にする必要があり、属性が「BA」の場合は次の属性の値にする必要があります(つまり、elem7 = "BA elem8 ="03"の場合は"03"出力が必要です)

複数の一致の危険性はないため、属性が「BA」の場合、「DA」属性はありませんが、値はどの要素でも発生する可能性があります

この単一のXPath式は、必要な値を生成します

  string(/*/@*[. = 'DA']
        |
         /*/@*[name()
              =
               concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
         )

そして、これが完全な変換です。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "string(/*/@*[. = 'DA']
            |
             /*/@*[name()
                  =
                   concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
             )"/>
 </xsl:template>
</xsl:stylesheet>

ご覧のとおり、この変換はXPath式を評価し、評価結果を出力にコピーするだけです。

このXMLドキュメントに変換が適用される場合(2番目のケース):

<SI elem1="TI"
    elem2="FN"
    elem3="4099450222"
    elem4="TM"
    elem5="4094110000"
    elem6="MT"
    elem7="BA"
    elem8="03"
    elem9="DS"
    elem10="DD"
    elem11="16"/>

結果は

03

同じ変換が最初に提供されたXMLドキュメントに適用される場合(最初のケース):

<SI elem1="TI"
    elem2="FN"
    elem3="4099450222"
    elem4="TM"
    elem5="4094110000"
    elem6="MT"
    elem7="SP"
    elem8="MC"
    elem9="DS"
    elem10="DA"
    elem11="16"/>

再び、必要な正しい結果が生成されます:

DA

説明

XPathユニオン演算子、および|関数string()、、、の適切な使用。substring-after()name()`concat()

于 2012-06-14T11:49:12.250 に答える