0

私が抱えている次の問題に対する xslt ソリューションを見つけようとしています。

ノード名と属性を共有するが異なる値を持つ 3 つの後続の行のセットを検索したいと考えています。入力の最初の行には識別子が含まれ、2 番目と 3 番目の行にはソース システムからの値が含まれます。2 行目と 3 行目の値が異なるセットを見つけたいです。

例えば

<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">78923</eba7:mi235>
<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">1111</eba7:mi235>
<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">2222</eba7:mi235>

また、識別子のみを持つ行のセット、識別子を持つ行のセットとソース システムからの値を持つ 1 つの行のみを持つ行のセット、または 2 番目と 3 番目の行が同じ値を持つ行のセットがある場合もあります。

例えば

<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x24-x195-x10-x4">78748</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x24-x195-x10-x4">0</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">78804</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">12345</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">12345</eba7:mi310>

これらは出力で見つけたくありません。

私が作成したい出力は

<eba7:mi235 id="78923" value1="1111" value2="2222" />

入力の構造は、行が常にこのように並べられるようになっています。そのため、位置を使用してそれらにアクセスしようとしましたが、うまくいきませんでした。

誰かが私を正しい方向に向けることができますか? ポジションの使い方は正しいですか?

以下の入力データを含むファイルを添付しました

ありがとう。

ポール。

<?xml version="1.0" encoding="utf-8"?>
<xbrl xml:lang="en" xmlns="http://www.xbrl.org/2003/instance" xmlns:eba7="http://www.eba.europa.eu/xbrl/crr/dict/met" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:link="http://www.xbrl.org/2003/linkbase">
<link:schemaRef xlink:type="simple" xlink:href="http://www.eba.europa.eu/eu/fr/xbrl/crr/fws/corep/its-2013-02/2014-07-31/mod/corep_con.xsd" />
<context id="I-2014-E">
<entity>
  <identifier scheme="http://www.dnb.nl/id">578</identifier>
</entity>
<period>
  <instant>2014-12-31</instant>
</period>
</context>  
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x24-x195-x10-x4">78748</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x24-x195-x10-x4">0</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">78804</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">12345</eba7:mi310>
<eba7:mi310 contextRef="I-2014-E-dim-x42-x9-x25-x195-x10-x4">12345</eba7:mi310>
<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">78923</eba7:mi235>
<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">1111</eba7:mi235>
<eba7:mi235 contextRef="I-2014-E-dim-x43-x9-x156-x51-x14">2222</eba7:mi235>
</xbrl>
4

2 に答える 2

2

質問が十分に定義されているとは思いません。それはいくつかの方法で解釈できます。

あなたがしたいことを私たちが想定した場合:

  1. タグ名と @contextRef 値の両方が同じであることに基づいて、指定されたすべての要素をグループ化します。要素の相互の位置は、この目的には関係ありません。

  2. 各グループの個別の値を数えます。3 つ以上ある場合は、共通のタグ名を持つ要素を出力に書き込み、このグループ内の個別の値ごとに番号付き属性を追加します。

次に、次のようなことを行うのがおそらく最善でしょう。

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xbrli="http://www.xbrl.org/2003/instance" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="k1" match="*" use="concat(name(), '|', @contextRef)"/>
<xsl:key name="k2" match="*" use="concat(name(), '|', @contextRef, '|', .)"/>

<xsl:template match="/xbrli:xbrl">
    <xsl:copy>
        <xsl:for-each select="*[count(.|key('k1', concat(name(), '|', @contextRef))[1])=1]">
            <xsl:variable name="distinct-values" select="key('k1', concat(name(), '|', @contextRef)) [count(.|key('k2', concat(name(), '|', @contextRef, '|', .))[1])=1]"/>
            <xsl:if test="count($distinct-values) &gt;= 3">
                <xsl:copy>
                    <xsl:for-each select="$distinct-values">
                        <xsl:attribute name="value{position()}">
                            <xsl:value-of select="."/>
                        </xsl:attribute>
                    </xsl:for-each>
                </xsl:copy>
            </xsl:if>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

次の整形式のテスト入力に適用されます:

<xbrl xmlns="http://www.xbrl.org/2003/instance" xmlns:eba7="http://www.eba.europa.eu/xbrl/crr/dict/met">
    <eba7:a contextRef="x">11</eba7:a>
    <eba7:a contextRef="x">12</eba7:a>

    <eba7:a contextRef="y">21</eba7:a>
    <eba7:a contextRef="y">22</eba7:a>
    <eba7:a contextRef="y">23</eba7:a>

    <eba7:b contextRef="x">31</eba7:b>
    <eba7:b contextRef="x">32</eba7:b>
    <eba7:b contextRef="x">33</eba7:b>
    <eba7:b contextRef="x">33</eba7:b>

    <eba7:c contextRef="x">41</eba7:c>
    <eba7:c contextRef="x">41</eba7:c>
    <eba7:c contextRef="x">42</eba7:c>
    <eba7:c contextRef="x">42</eba7:c>
</xbrl>

結果は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<xbrl xmlns="http://www.xbrl.org/2003/instance" xmlns:eba7="http://www.eba.europa.eu/xbrl/crr/dict/met">
   <eba7:a value1="21" value2="22" value3="23"/>
   <eba7:b value1="31" value2="32" value3="33"/>
</xbrl>

:

  1. これを理解するには、 Muenchian のグループ化方法に精通している必要があります。

  2. 番号付き属性は、XML の良い慣例ではありません。私はあなた(またはその権力者)がこの要件を再考することをお勧めします.

于 2015-02-15T17:57:33.527 に答える
1

このスタイルシートはあなたの問題を解決しますか:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xbrli="http://www.xbrl.org/2003/instance" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:key name="elements" match="*" use="@contextRef"/>

<xsl:template match="/xbrli:xbrl">
    <xsl:copy>
        <xsl:apply-templates select="*[@contextRef
                                        and count(key('elements', @contextRef)) = 3 
                                        and key('elements', @contextRef)[2] != key('elements', @contextRef)[3]
                                        and count(. | key('elements', @contextRef)[1]) = 1]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*">
    <xsl:copy>
        <xsl:attribute name="id">
            <xsl:value-of select="."/>
        </xsl:attribute>
        <xsl:attribute name="value1">
            <xsl:value-of select="key('elements', @contextRef)[2]"/>
        </xsl:attribute>
        <xsl:attribute name="value2">
            <xsl:value-of select="key('elements', @contextRef)[3]"/>
        </xsl:attribute>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

ここで、 akeyは要素を@contextRef識別子として一致させるために宣言されています。最初のテンプレートは、一意の最初の要素にテンプレートを適用します(また、合計要素が 3 である必要があり、2 番目と 3 番目の要素が同じ値であってはならないなど、@contextRef他の条件に一致するものも)。@contextRef

次のテンプレートはこれらの要素 (最初のテンプレートから) に一致し、さらなる出力を作成します。

于 2015-02-15T12:10:48.183 に答える