как получить другие теги, нацеливаясь на конкретный тег - PullRequest
0 голосов
/ 12 декабря 2011

Здесь я вставил образец XML с именами тегов, например 21A,50F,21D,22B.

Обычно, если мне нужно получить определенный тег, я легко могу использовать приведенную ниже логику в XSLT:

<xsl:choose>
    <xsl:when test="tag[name = '21A'] ">
        <xsl:choose>
            <xsl:when test="substring(tag[name = '21A']/value,1,1) = '/'">
                <xsl:variable name="result" select="concat(translate(tag[name = '21A']/value,',',' '),'&#13;')"/>
                <xsl:value-of select="substring(substring-before(substring-after($result,'&#13;'),'&#13;'),1,11)"/>
            </xsl:when>
            <xsl:when test="substring(tag[name = '21A']/value,1,1) != '/'">
                <xsl:value-of select="substring(tag[name = '21A']/value,1,11)"/>
            </xsl:when>
        </xsl:choose>
    </xsl:when>
</xsl:choose>

но здесь у меня есть требование как Sequence A и Sequence B.

  • теги, которые заполнены выше 50F, подпадают под sequence A
  • теги, которыенаходится под 50F и подпадает под sequence B

, поскольку нам нужно извлечь теги, используя тег 50F.Может ли кто-нибудь дать предложение?

<local>
    <message>
        <block4>
            <tag>
                <name>21A</name>
                <value>ALW1031</value>
            </tag>
            <tag>
                <name>50F</name>
                <value>TESTING CITI BANK EFT9</value>
            </tag>
            <tag>
                <name>21D</name>
                <value>OUR</value>
            </tag>
            <tag>
                <name>22B</name>
                <value>ipubby</value>
            </tag>
        </block4>
    </message>
</local>

Требуется вывод:

ALW1031,OUR

Ранее, если предположить, что они заполнили 21A два раза, значит, я использовал позицию как [1]и [2] как при вызове значений тега.Теперь они будут заполнять 21 тег повторно, но теги могут быть A или D, поэтому мне нужно целенаправленно указывать на тег 50f.Какой бы тег они ни предоставили, либо A, либо D до 50F Мне нужно извлекать аналогичным образом все, что они заполняют теги после 50F, мы можем выбирать так, избегая позиций.


Резюме : @ Treemonkey : надеюсь, вы взглянули на мой образец XML.У него есть тег типа 21A,50F и так далее.Предположим, что если у меня есть два поля field1,field2 ранее, они заполняют теги такими же повторяющимися тегами, что и 21A, в то время я выбрал значение 21A, рядом с которым отмечена позиция [1] для поля 1 (tag[name = '21A'][1]) * 1048.*

Аналогично 21A, имея рядом с отметкой [2] для поля 2, теперь они будут заполнять 21, но теги отличались от A или D.Как я уже сказал, field1 должен концентрироваться sequence A, а field2 должен концентрироваться как sequence B, поэтому теперь нам не нужно беспокоиться о позициях для выборки, у нас есть разграничение типа тега 50F, какие поля будут заполняться до того, как 50F будет иметьрассматривается как sequence A, а после 50F должно рассматриваться как sequence B.

Итак, наконец, нам нужно написать как XSLT, нацелив 50 F.Если я хочу отобразить поле 21A в (образец XML), которое до 50F, поэтому нам нужно написать логику в XSLT в качестве тега выбора 21A перед тегом 50F для получения данных в поле 1, а для поля 2 мынужно выбрать как 21D после 50F, поэтому нам нужно написать логику как select 21D после 50F.

1 Ответ

0 голосов
/ 12 декабря 2011

Ваши требования не совсем ясны, но следующие выражения должны помочь.

Выберите всех братьев и сестер перед tag, чей дочерний элемент name имеет определенное значение:

/*/*/*/tag[name='50F']/preceding-sibling::*

Выберите следующих братьев и сестер:

/*/*/*/tag[name='50F']/following-sibling::*

Выберите только непосредственно предшествующий элемент:

/*/*/*/tag[name='50F']/preceding-sibling::*[1]

Выберите предшествующих братьев и сестер, имеющих ребенка name с определенным значением:

/*/*/*/tag[name='50F']/preceding-sibling::*[name='21A']

Выберите следующих братьев и сестер, имеющих ребенка name с определенным значением:

/*/*/*/tag[name='50F']/following-sibling::*[name='21D']
...