xslt - удаляет данные в выражении foreach с определенным текстом () - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующий XML-файл, и я применяю XSLT-файл для вывода текстового файла, в котором каждая строка определяется для каждой записи.

<Data>
    <Record>
            <Identification1>AA123</Identification1>
            <SomeNode1>...</SomeNode1>
            <SomeNode2>...</SomeNode2>
            <SomeNode3>...</SomeNode3>
            <SecondIdent>XX123</SecondIdent>
            <SomeNode4>...</SomeNode4>
    </Record>
    <Record>
            <Identification1>BB123</Identification1>
            <SomeNode1>...</SomeNode1>
            <SomeNode2>...</SomeNode2>
            <SomeNode3>...</SomeNode3>
            <SecondIdent>XX123</SecondIdent>
            <SomeNode4>...</SomeNode4>
    </Record>
    <Record>
            <Identification1>CC124</Identification1>
            <SomeNode1>...</SomeNode1>
            <SomeNode2>...</SomeNode2>
            <SomeNode3>...</SomeNode3>
            <SecondIdent>AA123</SecondIdent>
            <SomeNode4>...</SomeNode4>
    </Record>
    <Record>
            <Identification1>DD123</Identification1>
            <SomeNode1>...</SomeNode1>
            <SomeNode2>...</SomeNode2>
            <SomeNode3>...</SomeNode3>
            <SecondIdent>XX123</SecondIdent>
            <SomeNode4>...</SomeNode4>
    </Record>
    <Record>
            <Identification1>DD123</Identification1>
            <SomeNode1>...</SomeNode1>
            <SomeNode2>...</SomeNode2>
            <SomeNode3>...</SomeNode3>
            <SecondIdent>XX123</SecondIdent>
            <SomeNode4>...</SomeNode4>
    </Record>
</Data>

Я уже создал код (ниже), который проверяет все данные / записи и проверяет, имеет ли другой узел (скажем, SomeNode2) более 8 цифр. Это прекрасно работает.

Выход был тогда:

AA123;...;...;...;XX123;...
BB123;...;...;...;XX123;...
CC123;...;...;...;AA123;...
DD123;...;...;...;XX123;...
XX123;...;...;...;XX123;...

Просто, легко, сделано.

Однако один попросил исключить все Данные / Записи, имеющие Идентификацию1 в любом из SecondIdent файла, с той особенностью, что он должен исключать только тех, кто начинает с " AA». Это самый сложный вопрос для меня.

Вывод должен выглядеть так:

BB123;...;...;...;XX123;...
CC123;...;...;...;AA123;...
DC123;...;...;...;XX123;...
XX123;...;...;...;XX123;...

Я не могу найти подходящее решение.

РЕДАКТИРОВАТЬ: в этом примере как Идентификация1 «AA123» присутствует в SecondIdent , его следует удалить, поскольку он начинается с «AA». Однако Identification1"XX123" присутствует, потому что он не начинается с "AA", даже если он присутствует несколько раз.

Я пробовал эти решения:

  • xsl: key: почему-то я не могу заставить это работать. Кажется, это скорее проблема знаний, чем проблема кодирования:)
  • Попробуйте создать переменную «$ count», которая будет подсчитывать количество раз, когда Идентификация1 присутствует во SecondIden. Затем в описанном ниже состоянии ifmnt в XLM я добавил переменную te = 0 (не работает, пустой документ) и счет непосредственно в операторе if

(count (/ Data / Record / EFA_ISIN_IDENT [содержит (., $ ISIN)]) = 0

It worked but when I tried to make another condition based on "AA" then I ran into problems (data not displaying or he kicked out all Identification beginning with "AA").

xslt код:

<?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" indent="no" encoding="UTF-8"/>
  <xsl:variable name="separator" select="';'"/>

<xsl:template match="/">

    <xsl:for-each select="Data/Record">
        <xsl:if test="( (string-length(format-number(./SomeNode2/text(),'0;0'))&lt;= '8') )">       
            <!--1.Identification-->
            <xsl:value-of select="./Identification1/text()"/>
            <xsl:value-of select="$separator"/>
            <!--2.SomeNode-->
            <xsl:value-of select="./SomeNode1/text()"/>
            <xsl:value-of select="$separator"/>
            <!--3.SomeNode-->
            <xsl:value-of select="./SomeNode2/text()"/>
            <xsl:value-of select="$separator"/> 
            <!--4.SecondIdent-->
            <xsl:value-of select="./SecondIdent/text()"/>
            <xsl:value-of select="$separator"/> 
            <!--5.SomeNode-->
            <xsl:value-of select="./SomeNode2/text()"/>
            <xsl:value-of select="$separator"/> 
            <xsl:value-of select="'&#xA;'" />
        </xsl:if>
    </xsl:for-each>

    </xsl:template> 

</xsl:stylesheet>   

И последнее, но не менее важное: я прошу прощения за мой английский и все опечатки / грамматику и благодарю вас за помощь!

1 Ответ

0 голосов
/ 04 июля 2018

Вы хотите получить следующее выражение ...

<xsl:for-each select="Data/Record[not(Identification1 = ../Record/SecondIdent and starts-with(Identification1, 'AA'))]">

Если вы хотите использовать ключ (который может быть лучше с большим набором данных), определите его следующим образом (это должен быть прямой дочерний элемент xsl:stylesheet)

<xsl:key name="secondIdents" match="Record" use="SecondIdent" />

И пользуйся вот так ...

<xsl:for-each select="Data/Record[not(key('secondIdents', Identification1) and starts-with(Identification1, 'AA'))]">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...