Как запустить xpath для конкретного xml с помощью xslt - PullRequest
0 голосов
/ 24 мая 2018

Вопрос почти такой же, как один из моих вопросов здесь редактировать конкретный xml с помощью xpath

Но теперь проблема в другом.Структура xml теперь немного отличается.Решение по предыдущему вопросу не будет работать здесь.

У меня есть ниже XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
    <map key="Request">
        <map key="Headers">
            <string key="Accept">application/json</string>
            <string key="Content-Type">application/json</string>
        </map>
        <map key="Payload">
            <map key="root">
                <array key="req1">
                    <string>puneet</string>
                    <string>taneja</string>
                </array>
                <array key="req2">
                    <string>ratan</string>
                </array>
            </map>
        </map>
    </map>
</map>

Ниже приведены XPATHS

/Request/Headers/Accept=app
/Request/Headers/Content-Type=json
/Request/Payload/root/req1[2]=singh
/Request/Payload/root/req1[1]=pradeep
/Request/Payload/root/req2=suman

Я хочу обновленный XML-результат, как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
    <map key="Request">
        <map key="Headers">
            <string key="Accept">application/json</string>
            <string key="Content-Type">application/json</string>
        </map>
        <map key="Payload">
            <map key="root">
                <array key="req1">
                    <string>pradeep</string>
                    <string>singh</string>
                </array>
                <array key="req2">
                    <string>suman</string>
                </array>
            </map>
        </map>
    </map>
</map>

По сути, я хочу изменить свой xml для заданных путей, используя xslt.Проверьте код по этому адресу xsltfiddle.liberty-development.net

Мне будет полезно иметь обновление в том же более раннем решении для этого сценария.

1 Ответ

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

Чтобы получить работающие пути типа

/Request/Payload/root/req1[2]=singh
/Request/Payload/root/req1[1]=pradeep

, вы можете добавить шаблон

<xsl:template match=".[contains(., '[') and contains(., '=')]" mode="step">
    <xsl:if test="position() gt 1">/</xsl:if>
    <xsl:sequence select="'*[@key = ''' || substring-before(., '[') || ''']/*[' || replace(., '^[^\[]+\[([0-9]+)\].*$', '$1') || ']'"/>
</xsl:template>

, чтобы генерировался код типа

   <xsl:template match="*[@key = 'Request']/*[@key = 'Payload']/*[@key = 'root']/*[@key = 'req1']/*[1]">
      <xsl:copy>
         <xsl:copy-of select="@*"/>pradeep</xsl:copy>
   </xsl:template>
   <xsl:template match="*[@key = 'Request']/*[@key = 'Payload']/*[@key = 'root']/*[@key = 'req1']/*[2]">
      <xsl:copy>
         <xsl:copy-of select="@*"/>singh</xsl:copy>
   </xsl:template>

, см. https://xsltfiddle.liberty -development.net / bdxtpY / 1 .

В настоящее время я не уверен, как из /Request/Payload/root/req2=suman сделать вывод о том, что задействован элемент массива.

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