Удалить определенные xmlns из xml используя xslt - PullRequest
0 голосов
/ 10 мая 2018
<Orders xmlns="hi/hi" xmlns:shipping="hello/hi" xmlns:message="hello/hi" message:timestamp="2018-04-23T14:28:39Z">
    <orderLineStatusUpdate orderNumber="CCORD002" line="0">
        <orderLineStatus>inPicking</orderLineStatus>
        <shipmentNumber>1</shipmentNumber>
        <leadTime unit="days">
            <shipping:min>1</shipping:min>
            <shipping:max>1</shipping:max>
        </leadTime>
    </orderLineStatusUpdate>
</Orders>

Ожидаемый результат:

<Orders message:timestamp="2018-04-23T14:28:39Z">
    <orderLineStatusUpdate orderNumber="CCORD002" line="0">
        <orderLineStatus>inPicking</orderLineStatus>
        <shipmentNumber>1</shipmentNumber>
        <leadTime unit="days">
            <shipping:min>1</shipping:min>
            <shipping:max>1</shipping:max>
        </leadTime>
    </orderLineStatusUpdate>
</Orders>

Это XSLT, который я использую.Это удалит shipping:min и shipping:max из кода.Я просто хочу удалить xmlns.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name(.)}">
        <xsl:value-of select="." />
       </xsl:attribute>
    </xsl:template>
    <xsl:template match="@*[local-name(.)='message']" />
</xsl:stylesheet>

, но мой XSLT-код удаляет shipping:min и shipping:max также

Ответы [ 2 ]

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

Вы не можете. Ожидаемый вывод - недопустимый XML, поскольку он содержит необъявленный префикс пространства имен shipping:. Более важный вопрос здесь , почему вы хотите удалить верные узлы для выражения имеющейся у вас структуры XML.

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

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

Замените ваше шаблонное правило match="*" на два шаблонных правила, одно для соответствия элементам, чье пространство имен должно быть удалено, другое для соответствия элементам, чье пространство имен должно быть сохранено:

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

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

match="*[namespace-uri()='hi/hi']"

и

match="*[namespace-uri()='hello/hi']"

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

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