У меня есть входной XML, в котором была изменена одна схема элементов. Итак, согласно новой схеме, я переименовал ее. Теперь для этого конкретного элемента я получаю дополнительное пространство имен в выходном XML.Удаление пространства имен для измененного элемента в XSL
Я использовал исключающие префиксы, но он не был удален. Я хочу только тот конкретный элемент, который получил переименование, чтобы удалить пространство имен. Так или иначе, XSL, который я использовал до , лишает все пространства имен, которые поступают в мыльный конверт, мыло и т. Д., А не только для конкретного элемента.
Почему только измененный элемент дает ошибку пространства имен. Я даю неправильное объявление схемы, давая новую схему для старого элемента (мое сомнение также, но изменение старой схемы не влияет) или любую другую ошибку. Любые предложения по этому поводу приветствуются.
Формат входного XML исправлен. Поэтому необходимо внести изменения только в XSLT, чтобы удалить дополнительное пространство имен, появившееся после переименованного элемента (элемент PartyDetails). Все остальные элементы и их пространство имен, контракты должны быть неповрежденными.
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<MethodResponseType xmlns="http://example.test.com/Trialmethods/Run">
<MessageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ListResponse i:nil="true" />
<OptionsResponse i:nil="true" />
<PartyResponse>
<DemoHolder>
<Details>
<ContractType>
<ID>001</ID>
<Name>
<FirstName>Mano</FirstName>
<Initial>1</Initial>
</Name>
</ContractType>
</Details>
</DemoHolder>
</PartyResponse>
</MessageResponse>
</MethodResponseType>
</s:Body>
</s:Envelope>
XSLT для удаления пространства имен.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ns="http://example.test.com/Trialmethods/Run"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
exclude-result-prefixes="ns xsl">
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<!-- Identity template, provides default behavior that copies all content-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- More specific template for ns:Details that provides custom behavior -->
<xsl:template match="ns:Details">
<PartyDetails>
<xsl:apply-templates select="*" mode="strip"/>
</PartyDetails>
</xsl:template>
<!-- template to strip out namespaces-->
<xsl:template match="*" mode="strip">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*" mode="copy"/>
<xsl:apply-templates select="*|text()" mode="strip"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Выход с пустым пространством имен при переименованном элементе.
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header/>
<s:Body>
<MethodResponseType xmlns="http://example.test.com/Trialmethods/Run">
<MessageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ListResponse i:nil="true"/>
<OptionsResponse i:nil="true"/>
<PartyResponse>
<DemoHolder>
<PartyDetails xmlns=""><ContractType>
<ID>001</ID>
<Name>
<FirstName>Mano</FirstName>
<Initial>1</Initial>
</Name>
</ContractType></PartyDetails>
</DemoHolder>
</PartyResponse>
</MessageResponse>
</MethodResponseType>
</s:Body>
</s:Envelope>
Что такое ** ** точный вывод, который вы хотите получить из исходного входного XML? –
Привет, Я хочу удалить пространство имен, появившееся после модифицированного элемента PartyDetails. – Mano
Разве вы не разместили это пространство имен самостоятельно? Если вы этого не хотите, зачем его там ставить? Во всяком случае, это не отвечает на мой вопрос. Пожалуйста, укажите точный результат, который вы хотите, в качестве кода. Прямо сейчас у вас есть выход до этого и выводятся после этого, и это запутывает. Кажется, вы думаете, что это нужно делать на двух или более этапах - я не вижу причин для этого. –