У меня есть следующий 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'))<= '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="'
'" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
И последнее, но не менее важное: я прошу прощения за мой английский и все опечатки / грамматику и благодарю вас за помощь!