XSLT множественные трансформации - PullRequest
0 голосов
/ 22 мая 2018

У меня есть XML как это:

<Entity>
    <Type>1</Type>
    <Number>111</Number>
    <GroupList>
        <Group>
            <Id>1001</Id>
            <FieldsList>
                <Field>
                    <Name>foo</Name>
                    <Value>123</Value>
                    <Type>String</Type>
                </Polje>
            </FieldList>
        </Group>
        <Group>
            <Id>1002</Id>
            <FieldsList>
                <Field>
                    <Name>bar</Name>
                    <Value>456</Value>
                    <Type>String</Type>
                </Field>
            </Field>
        </Group>
    </GroupList>
</Entity>

Через XSLT-преобразование я хочу добиться этого:

<Entity>
    <Type>1</Type>
    <Number>111</Number>
    <GroupList>1001:foo,123,String;1002:bar,456,String</GroupList>
</Entity>

Когда я использую это преобразование

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Field">
        <xsl:copy>
            <xsl:value-of select=
                    "concat(Name,',',Value,',',Type)
                    "/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Group">
        <xsl:copy>
            <xsl:value-of select=
                    "concat(Id, ': ',FieldsList, ';')
                    "/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Я получаю результат, подобный следующему:

<Entity>
   <Type>1</Type>
   <Number>111</Number>
   <GroupList>
      <Group>1001: foo123String;</Group>
      <Group>1002: bar456String;</Group>
   </GroupList>
</Entity>

Можно ли в любом случае использовать два разных шаблона для объединения на разных уровнях узлов?

1 Ответ

0 голосов
/ 22 мая 2018

Я думаю, вам нужно удалить некоторые xsl:copy и вам нужно использовать xsl:apply-templates:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Field">
            <xsl:value-of select=
                    "concat(Name,',',Value,',',Type)
                    "/>
    </xsl:template>

    <xsl:template match="Group">
            <xsl:if test="position() > 1">;</xsl:if>
            <xsl:value-of select="concat(Id, ':')"/>
            <xsl:apply-templates select="FieldList/Field"/>
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 94hvTz4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...