Карта XML - удалить имена клавиш входа @

После моего вопроса относительно (Convert JSON в XML с использованием XSLT 3.0 - избегайте амперсанда в ключе элемента). В итоге я получил следующую карту XML.

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="@odata.context">https://swdev.api.crm4.dynamics.com/api/data/v9.0/$metadata#msdyn_bookingjournals(msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode)</string>
   <array key="value">
      <map>
         <string key="@odata.etag">W/"3935842"</string>
         <string key="[email protected]">Travel</string>
         <number key="msdyn_journaltype">690970002</number>
         <string key="msdyn_name">856900132906 - Wartung  - Wartung - 101 Innener Verkehrsring/Düsseldorferstr </string>
         <string key="[email protected]">13.11.2018 13:11</string>
         <string key="msdyn_starttime">2018-11-13T13:11:58Z</string>
         <string key="[email protected]">13.11.2018 13:15</string>
         <string key="msdyn_endtime">2018-11-13T13:15:58Z</string>
         <string key="[email protected]">4</string>
         <number key="msdyn_duration">4</number>
         <string key="foc_sapstatisticalkeyfigurecod"/>
         <string key="[email protected]">Active</string>
         <number key="statecode">0</number>
         <string key="msdyn_bookingjournalid">cb6d62ee-49e7-e811-a958-000d3a29fea4</string>
      </map>
      <map>
         <string key="@odata.etag">W/"3935846"</string>
         <string key="[email protected]">Working Hours</string>
         <number key="msdyn_journaltype">690970000</number>
         <string key="msdyn_name">856900132906 - Wartung  - Wartung - 101 Innener Verkehrsring/Düsseldorferstr </string>
         <string key="[email protected]">13.11.2018 13:15</string>
         <string key="msdyn_starttime">2018-11-13T13:15:58Z</string>
         <string key="[email protected]">13.11.2018 13:20</string>
         <string key="msdyn_endtime">2018-11-13T13:20:57Z</string>
         <string key="[email protected]">4</string>
         <number key="msdyn_duration">4</number>
         <string key="foc_sapstatisticalkeyfigurecod"/>
         <string key="[email protected]">Active</string>
         <number key="statecode">0</number>
         <string key="msdyn_bookingjournalid">fe6d62ee-49e7-e811-a958-000d3a29fea4</string>
      </map>
   </array>
   <string key="@odata.nextLink">https://xx.api.crm4.dynamics.com/api/data/v9.0/bookableresourcebookings(b0fe5834-45e7-e811-a958-000d3a29fb7a)/msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking?$select=msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode&amp;$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520parentEntityId%253d%2522b0fe5834-45e7-e811-a958-000d3a29fb7a%2522%2520parentAttributeName%253d%2522msdyn_booking%2522%2520parentEntityObjectTypeCode%253d%25221145%2522%253e%253cmsdyn_bookingjournalid%2520last%253d%2522%257bFE6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520first%253d%2522%257bCB6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20/%3E</string>
</map>

Как описано в другом вопросе пользователей (Преобразование JSON в XML с помощью XSLT 3.0 functions), я хотел преобразовать элементы строки / числа в желаемый формат XML. К сожалению, знак '@' в именах клавиш вызывает проблемы:

Unable to generate the XML document using the provided XML/XSL input.
Invalid element name. Invalid QName {@odata.context}

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math" version="3.0">
    <xsl:output indent="yes" />
<xsl:template match="*[@key]" xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
    <xsl:element name="{@key}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

Как удалить все знаки «@» в именах элементов карты XML (желательно также и для имен вложенных элементов)?

Изменить: это был исходный ввод JSON

{
    "@odata.context": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/$metadata#msdyn_bookingjournals(msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode)",
    "value": [
    {
        "@odata.etag": "W\/\"3935842\"",
        "[email protected]": "Travel",
        "msdyn_journaltype": 690970002,
        "msdyn_name": "Wartung  - Wartung - 101 Innener Verkehrsring\/D\u00fcsseldorferstr ",
        "[email protected]": "13.11.2018 13:11",
        "msdyn_starttime": "2018-11-13T13:11:58Z",
        "[email protected]": "13.11.2018 13:15",
        "msdyn_endtime": "2018-11-13T13:15:58Z",
        "[email protected]": "4",
        "msdyn_duration": 4,
        "foc_sapstatisticalkeyfigurecod": "",
        "[email protected]": "Active",
        "statecode": 0,
        "msdyn_bookingjournalid": "cb6d62ee-49e7-e811-a958-000d3a29fea4"
    },
    {
        "@odata.etag": "W\/\"3935846\"",
        "[email protected]": "Working Hours",
        "msdyn_journaltype": 690970000,
        "msdyn_name": "Wartung  - Wartung - 101 Innener Verkehrsring\/D\u00fcsseldorferstr ",
        "[email protected]": "13.11.2018 13:15",
        "msdyn_starttime": "2018-11-13T13:15:58Z",
        "[email protected]": "13.11.2018 13:20",
        "msdyn_endtime": "2018-11-13T13:20:57Z",
        "[email protected]": "4",
        "msdyn_duration": 4,
        "foc_sapstatisticalkeyfigurecod": "",
        "[email protected]": "Active",
        "statecode": 0,
        "msdyn_bookingjournalid": "fe6d62ee-49e7-e811-a958-000d3a29fea4"
    }
    ],
    "@odata.nextLink": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/bookableresourcebookings(b0fe5834-45e7-e811-a958-000d3a29fb7a)\/msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking?$select=msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520parentEntityId%253d%2522b0fe5834-45e7-e811-a958-000d3a29fb7a%2522%2520parentAttributeName%253d%2522msdyn_booking%2522%2520parentEntityObjectTypeCode%253d%25221145%2522%253e%253cmsdyn_bookingjournalid%2520last%253d%2522%257bFE6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520first%253d%2522%257bCB6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20\/%3E"
}

К каким тегам cdata были добавлены, поскольку элемент '@ odata.nextLink' содержит URL-адреса, в которых может быть &.

<data>
    <![CDATA[
        {
            "@odata.context": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/$metadata#msdyn_bookingjournals(msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode)",
            "value": [
            {
                "@odata.etag": "W\/\"3935842\"",
                "[email protected]": "Travel",
                "msdyn_journaltype": 690970002,
                "msdyn_name": "Wartung  - Wartung - 101 Innener Verkehrsring\/D\u00fcsseldorferstr ",
                "[email protected]": "13.11.2018 13:11",
                "msdyn_starttime": "2018-11-13T13:11:58Z",
                "[email protected]": "13.11.2018 13:15",
                "msdyn_endtime": "2018-11-13T13:15:58Z",
                "[email protected]": "4",
                "msdyn_duration": 4,
                "foc_sapstatisticalkeyfigurecod": "",
                "[email protected]": "Active",
                "statecode": 0,
                "msdyn_bookingjournalid": "cb6d62ee-49e7-e811-a958-000d3a29fea4"
            },
            {
                "@odata.etag": "W\/\"3935846\"",
                "[email protected]": "Working Hours",
                "msdyn_journaltype": 690970000,
                "msdyn_name": "Wartung  - Wartung - 101 Innener Verkehrsring\/D\u00fcsseldorferstr ",
                "[email protected]": "13.11.2018 13:15",
                "msdyn_starttime": "2018-11-13T13:15:58Z",
                "[email protected]": "13.11.2018 13:20",
                "msdyn_endtime": "2018-11-13T13:20:57Z",
                "[email protected]": "4",
                "msdyn_duration": 4,
                "foc_sapstatisticalkeyfigurecod": "",
                "[email protected]": "Active",
                "statecode": 0,
                "msdyn_bookingjournalid": "fe6d62ee-49e7-e811-a958-000d3a29fea4"
            }
            ],
            "@odata.nextLink": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/bookableresourcebookings(b0fe5834-45e7-e811-a958-000d3a29fb7a)\/msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking?$select=msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode&$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22%253ccookie%2520page%253d%25221%2522%2520parentEntityId%253d%2522b0fe5834-45e7-e811-a958-000d3a29fb7a%2522%2520parentAttributeName%253d%2522msdyn_booking%2522%2520parentEntityObjectTypeCode%253d%25221145%2522%253e%253cmsdyn_bookingjournalid%2520last%253d%2522%257bFE6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520first%253d%2522%257bCB6D62EE-49E7-E811-A958-000D3A29FEA4%257d%2522%2520%252f%253e%253c%252fcookie%253e%22%20istracking=%22False%22%20\/%3E"
        }
    ]]>
</data>

и следующий xslt был применен для преобразования выше в XML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math" version="3.0">
    <xsl:output indent="yes" />
    <xsl:template match="data">
        <xsl:copy-of select="json-to-xml(.)/*" />
    </xsl:template>
</xsl:stylesheet>

person user2215655    schedule 10.01.2019    source источник
comment
Неясно, какой у вас формат ввода (какой-то JSON, который вы не показали, XML, который вы указали в своем вопросе в качестве карты) и что вы хотите делать с этим вводом. Какое программное обеспечение, какой именно код вы используете, что выдает ошибку Невозможно сгенерировать XML-документ с использованием предоставленных входных данных XML / XSL. Если все, что вам нужно, это удалить знак @ из строки, тогда и replace(@key', '@', ''), и translate(@key, '@', '') должно быть достаточно.   -  person Martin Honnen    schedule 10.01.2019
comment
Скопируйте / вставьте XML и XSLT в шоу freeformatter.com/xsl-transformer.html проблема. Я прояснил вопрос, добавив исходный контекст. Можете ли вы добавить свое предложение в XSLT, где я конвертирую карту XML с ключами?   -  person user2215655    schedule 10.01.2019
comment
<xsl:element name="{@key}"> пытается вычислить имя элемента, если вы получаете ошибку из-за символов @ в выражении @key, вы можете использовать <xsl:element name="{replace(@key', '@', '')}">, чтобы избежать ошибки и создать элементы результата на основе атрибута key, но с удаленными @s.   -  person Martin Honnen    schedule 10.01.2019
comment
Спасибо! Примечание: небольшая опечатка, необходимо удалить клавишу 'after. Я создал скрипку xsltfiddle.liberty-development.net/bnnZVy. XSLT удаляет контейнер ‹map›, разделяющий различные выходные значения. Можно это добавить?   -  person user2215655    schedule 10.01.2019
comment
Если вы хотите сохранить структуру ввода и просто преобразовать элементы, для которых вы написали этот шаблон, который вы показали, тогда в XSLT 3 правильным способом будет использовать <xsl:mode on-no-match="shallow-copy"/> (xsltfiddle.liberty-development.net/bnnZVy/1). Но элементы ввода находятся в этом конкретном пространстве имен, в то время как ваш текущий шаблон создает элементы без пространства имен, и до сих пор вы действительно не объяснили, какой формат результата вы хотите, чтобы предложение приводило к элементам в разных пространствах имен, вероятно, не в том, что вы хотите.   -  person Martin Honnen    schedule 10.01.2019
comment
Сгенерированный XML будет использоваться для синтаксического анализа в скрипте Groovy, выполняя вычисления / агрегирование меток времени.   -  person user2215655    schedule 10.01.2019
comment
Неглубокая копия приводит к пустым элементам пространства имен xmlns =. Правильно ли пропустить мелкую копию и удалить все пространства имен с помощью <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="node()|@*"/> </xsl:element> </xsl:template>, см. xsltfiddle.liberty-development .net / bnnZVy / 3   -  person user2215655    schedule 16.01.2019


Ответы (1)


Просто измени

<xsl:element name="{@key}">

to

<xsl:element name="{translate(@key, '@', '')}"> 

или возможно

<xsl:element name="{translate(@key, '@', '_')}">

Конечно, нет никакой гарантии, что этого достаточно, чтобы получить правильное имя XML-элемента. Но похоже, что знаки «@» - единственное очевидное, что вам нужно исправить в этих конкретных данных.

person Michael Kay    schedule 10.01.2019
comment
Как лучше всего удалить пустые / все элементы пространства имен, такие как xmlns =. Правильно ли пропустить мелкую копию и удалить все пространства имен с помощью <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="node()|@*"/> </xsl:element> </xsl:template>, см. xsltfiddle.liberty-development .net / bnnZVy / 3 - person user2215655; 17.01.2019
comment
Необъявление пространства имен, например xmlns="", появляется в вашем выводе, если вы генерируете элемент в пространстве без имен, родительский элемент которого находится в каком-то другом пространстве имен. Способ избежать объявления пространства имен - это поместить все элементы, которые вы создаете, в правильное пространство имен. - person Michael Kay; 17.01.2019
comment
Первоначальный процесс преобразовывает odata в XML через json-to-xml (), см. xsltfiddle.liberty- development.net/6r5Gh2B/1. Это помещает пространство имен <map xmlns="http://www.w3.org/2005/xpath-functions"> на место. Затем используется <xsl:template match="*[@key]" xpath-default-namespace="http://www.w3.org/2005/xpath-functions"><xsl:element name="{translate(@key, '@', '')}"><xsl:apply-templates/></xsl:element></xsl:template>, представляя пустые пространства имен, см. xsltfiddle.liberty-development.net/jyRYYhT. Можете ли вы обновить скрипку, чтобы исправить это при преобразовании? Спасибо за вашу помощь - person user2215655; 21.01.2019