2015-02-15 2 views
0

Я пытаюсь найти решение xslt для следующей проблемы, которую я имею.Попытка найти следующие две строки в экземпляре экземпляра XBRL

Я хочу найти набор из трех последующих строк, которые разделяют имя узла и атрибут, но имеют разные значения. Первая строка на входе содержит идентификатор, вторая и третья строки содержат значения из исходной системы. Я хочу найти множества, где вторая и третья строки имеют разные значения.

E.g.

<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> 

Там также могут быть наборы строк только с идентификатором, набор строки с идентификатором и только одну строку со значением из исходной системы или набора строк, где второй и третий ряд имеют такое же значение.

E.g.

<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" /> 

Структура ввода такова, что строки всегда упорядоченный, как это. Поэтому я попытался получить доступ к ним с помощью позиции, но это не сработало.

Может ли кто-нибудь указать мне в правильном направлении? Правильно ли используется позиция?

Я приложил файл с входными данными ниже

Спасибо.

Paul.

<?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> 
+0

Это вопрос группировки. Пожалуйста, укажите, какую версию XSLT вы используете, - ответы на них разные. - Что, если есть последовательность из 4? –

+0

XSLT 1.0 используется Возможна последовательность из 4: 3 значения для конкретного идентификатора. Я оставил это, чтобы привести пример как можно проще. Я ожидаю, что смогу расширить решение от Lingamurthy CS для этого случая. – Paul

+0

Как я уже сказал в своем ответе, вопрос не слишком четко определен. Еще хуже то, что ваш пример ввода не является корректным и не может быть использован для тестирования. –

ответ

2

Я не думаю, что вопрос определен достаточно хорошо; его можно интерпретировать несколькими способами.

Если мы предположим, что вы хотите:

  1. Группа все заданные элементы, основанные на как название тега и значение @contextRef быть тем же самым; с взаимным положением элементов, не имеющих отношения к этой цели;

  2. Подсчитайте отдельных значений в каждой группе; если их три или больше, напишите элемент с общим именем тега на выходе и добавьте нумерованный атрибут для каждого отдельного значения в этой группе;

, то это было бы, вероятно, лучше сделать что-то вроде:

XSLT 1,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. Я предлагаю вам (или полномочия, которые будут) пересмотреть это требование.

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> 

Здесь, key объявляется соответствие элементов с @contextRef является идентификатором. Первый шаблон применяет шаблоны к первым элементам с уникальными @contextRef (а также те, которые соответствуют другим условиям, таким как суммарные элементы с этим @contextRef, должны быть 3, а второй и третий элементы не должны иметь одинаковое значение).

Следующий шаблон соответствует этим элементам (из первого шаблона) и создает дополнительный вывод.

+0

Hello Lingamurthy, Спасибо. Это прекрасно работает. Правильно ли я понимаю, что ваш подход: 1) постройте таблицу всех имеющихся значений, используйте contextRef в качестве идентификатора. – Paul

+0

@Paul, я верю, что ответ michael.hor257k делает правильную работу. Мой ответ не видит, совпадают ли имена элементов. –

+0

'@Lingamurthy: вы правы в пропуске разных имен элементов. Я думаю, было бы относительно легко расширить ваш подход, включив в него имя элемента. Я согласен, что решение Michaels лучше, ваше легко понять. – Paul

Смежные вопросы