XPATH Challenge - Хотите скопировать внутренний элемент - PullRequest
0 голосов
/ 05 ноября 2010

Я борюсь с тем, что должно быть простым XSL: скопируйте updateResponse из сообщения ниже (примечание: мне нужен синтаксис XPATH 1.0 для совместимости с моей системой интеграции):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:n="urn:enterprise.soap.sforce.com">
    <soapenv:Body>
        <updateResponse>
            <result>
                <id>001S000000J1Bu0IAF</id>
                <success>true</success>
            </result>
        </updateResponse>
    </soapenv:Body>
</soapenv:Envelope>

Я просто хочу, чтобы структура результата была:

<updateResponse xmlns="urn:enterprise.soap.sforce.com">
    <result>
        <id>001S000000J1Bu0IAF</id>
        <success>true</success>
    </result>
</updateResponse>

Я могу скопировать объекты мыла, но мне не удается скопировать дочерние элементы элемента soapenv: Body. Первая копия работает для Body, но вторая не разрешает XPATH. Мой редактор запросов XMLPY xpath говорит, что xpath допустим, но XSL не разрешается.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:urn="enterprise.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:namespace-alias stylesheet-prefix="soapenv" result-prefix="foo"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/soapenv:Envelope/soapenv:Body/urn:updateResponse"/>
    </xsl:template>

    <xsl:template match="/soapenv:Envelope/soapenv:Body/urn:updateResponse">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 3 ]

1 голос
/ 05 ноября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:template match="/soapenv:Envelope/soapenv:Body//*">
        <xsl:element name="{local-name()}"
                     namespace="urn:enterprise.soap.sforce.com">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Выход:

<updateResponse xmlns="urn:enterprise.soap.sforce.com">
    <result>
        <id>001S000000J1Bu0IAF</id>
        <success>true</success>
    </result>
</updateResponse>

Примечание : Во-первых, объявление пространства имен в вашей таблице стилей неверно. Это должно быть xmlns:urn="urn:enterprise.soap.sforce.com". Во-вторых, для точного результата вам нужно разделить пространства имен области (их три: xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/", xmlns="urn:enterprise.soap.sforce.com" (по умолчанию) и xmlns:n="urn:enterprise.soap.sforce.com)

1 голос
/ 05 ноября 2010

Ваши пространства имен не совпадают между вашими данными и таблицей стилей, что, похоже, является единственной проблемой.

В вашем документе таблицы стилей измените это:

xmlns:urn="enterprise.soap.sforce.com"

на следующее:

xmlns:urn="urn:enterprise.soap.sforce.com"

Тогда он будет соответствовать объявленным пространствам имен в вашем исходном входном файле.

0 голосов
/ 05 ноября 2010

Пространства имен в этом документе странные; у вас есть xmlns и xmlns: n, оба назначены одному и тому же пространству имен. Похоже, //soapenv:updateResponse должно работать. Вы пробовали это?

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