XSLT-преобразование для пар имя-значение - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь отформатировать исходный XML в целевой формат, который приведен ниже.Но это не работает, как ожидалось.

Значение " AttributeName " должно стать именем элемента в целевом xml, а значение элемента " AttributeValue " должно стать значением.Исходный и целевой примеры XMLS приведены ниже. Как этого добиться с помощью XSLT?

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet4>
    <Record4>
        <FulfillmentID>49</FulfillmentID>
        <LineID>324</LineID>
        <OrderID>2109006</OrderID>
        <AttributeName>LAST_EXTRACT_NUMBER</AttributeName>
        <AttributeValue>test64565</AttributeValue>
    </Record4>
        <Record4>
        <FulfillmentID>49</FulfillmentID>
        <LineID>324</LineID>
        <AttributeName>LAST_EXTRACT_NUMBER</AttributeName>
        <AttributeValue>test64565</AttributeValue>
    </Record4>
</ResultSet4>

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet4>
    <Record4>
        <FulfillmentID>49</FulfillmentID>
        <LineID>324</LineID>
        <OrderID>2109006</OrderID>
        <Line bridged >test12 </Line bridged >
    </Record4>
    <Record4>
        <FulfillmentID>50</FulfillmentID>
        <LineID>324</LineID>
        <OrderID>2109006</OrderID>
        <LAST_EXTRACT_NUMBER>test64565</LAST_EXTRACT_NUMBER>
    </Record4>
</ResultSet4>

, где теги

<AttributeName>LAST_EXTRACT_NUMBER</AttributeName> and                            
<AttributeValue>test64565</AttributeValue> 

должны быть преобразованы в один тег, например:

<Line bridged >test12 </Line bridged >.

1 Ответ

0 голосов
/ 24 января 2019

Значение «AttributeName» должно стать именем элемента в целевом xml, а значение элемента «AttributeValue» должно стать значением.

Вот один из способов сделать это:

XSLT 1.0

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

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

<xsl:template match="AttributeName">
    <xsl:element name="{.}">
        <xsl:value-of select="following-sibling::AttributeValue"/>
    </xsl:element> 
</xsl:template>

<xsl:template match="AttributeValue"/>

</xsl:stylesheet>

Результат отличается от показанного в вашем вопросе, но я считаю, что это скорее недостаток вопроса, чем ответа.

Обратите внимание, что предполагается, что AttributeName всегда будет содержать действительное имя элемента XML.

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