Получить несколько значений атрибутов из элемента XML с помощью XSLT - PullRequest
0 голосов
/ 05 марта 2019

У меня есть XML как ниже

<Screenings>
    <Screening type="EFG" desc="Financial Report">
        <ScreeningStatus>
            <OrderStatus>Complete</OrderStatus>
            <ResultStatus>Review</ResultStatus>
        </ScreeningStatus>
    </Screening>
    <Screening type="EFG" desc="Financial Report">
        <ScreeningStatus>
            <OrderStatus>Complete</OrderStatus>
            <ResultStatus>Fail</ResultStatus>
        </ScreeningStatus>
    </Screening>ngStatus>
    </Screening>
    <Screening subtype="CARG" type="ABCD"  desc="registry search">
        <ScreeningStatus>
            <OrderStatus>InProgress</OrderStatus>
        </ScreeningStatus>
    </Screening>
    <Screening subtype="CARG" type="ABCD"  desc="registry search">
        <ScreeningStatus>
            <OrderStatus>InProgress</OrderStatus>
        </ScreeningStatus>
    </Screening>
    <Screening subtype="KARG" type="ABCD">
        <ScreeningStatus>
            <OrderStatus>InProgress</OrderStatus>
        </ScreeningStatus>
    </Screening>
    <Screening subtype="KARG" type="ABCD"  desc="registry search">
        <ScreeningStatus>
            <OrderStatus>InProgress</OrderStatus>
        </ScreeningStatus>
    </Screening>
</Screenings>

Мне нужна строка как показано ниже (Получить уникальные атрибуты type и subtype)

EFG-|ABCD-CARG|ABCD-KARG

Тогда разделите это по трубе | и цикл через это. Внутри цикла мне нужен тип и подтип, разделенные дефисом (-) Нужно два variables для типа и подтипа - как показано ниже

for (split by pipe | val : array) {
       split by hyphen and create two variable for type and subtype
       (ABCD-KARG)
       var type=ABCD
       var subtype=KARG
       // I have some business logic to do here
}

Я пробовал это -

<xsl:variable name="typeSubTypeArray" select="string-join(./ns0:Screening/@type, ',')"/>

Но я не могу добавить к нему значение подтипа и создать уникальную строку значения комбинации

Также, если он только печатает, но не подтип, я получаю уникальное значение, используя это -

<xsl:for-each select="distinct-values(./ns0:Screening/@type))">

Но как мне получить уникальное значение, используя комбинацию типа / подтипа. Мне нужны значения атрибутов.

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Вы слишком усложняете процесс здесь?Я думаю, что вы можете просто использовать xsl:for-each-group, чтобы получить нужные вам значения, без необходимости создавать строку, а затем разбивать ее.

<xsl:for-each-group select="Screening" group-by="@type">
  <xsl:for-each-group select="current-group()" group-by="string(@subtype)">
    <xsl:value-of select="concat('Processing ', @type, ' - ', @subtype, '&#10;')" />
  </xsl:for-each-group>
</xsl:for-each-group>

Обратите внимание, что если вы действительно хотите создать свой канал,строка с разделителями, вы бы сделали это ...

<xsl:variable name="distinct" select="string-join(distinct-values(Screening/concat(@type, '-', @subtype)), '|')" />
1 голос
/ 05 марта 2019

Если я правильно понимаю ваш вопрос, вы могли бы сделать:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />

<xsl:template match="/Screenings">
    <xsl:variable name="groups">
        <xsl:for-each-group select="Screening" group-by="concat(@type, '-', @subtype)">
            <group key="{current-grouping-key()}"/>
        </xsl:for-each-group>
    </xsl:variable>
    <xsl:value-of select="$groups/group/@key" separator="|"/>
</xsl:template>

</xsl:stylesheet>

Или просто:

<xsl:template match="/Screenings">
    <xsl:value-of select="distinct-values(Screening/concat(@type, '-', @subtype))" separator="|"/>
</xsl:template>
...