2016-07-18 1 views
1

См. XSLT, входной XML, желаемый выходной XML и фактический вывод, я получаю ниже.Как сохранить префикс пространства имен при выполнении обработки XSLT

  • Мне нужно УДАЛИТЬ все теги, если у него нет значения или пробелов. например: удалить <abc></abc>
  • Использования ниже XSLT, пустые теги преобразуются в самозапорных тег (которые я полностью хочу удалить), Кроме пространств имен становятся удалены например: <soapenv:Body> преобразуется в <Body>(который я хочу сохранить как есть)
  • Пожалуйста, помогите мне достичь желаемого результата, не удаляя префикс пространства имен.

XSLT

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="grandParent"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <childValues> 
       <xsl:value-of select="normalize-space(.)" /> 
      </childValues> 
      <xsl:apply-templates select="node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>    

Входной XML--

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" userName="sigma" sessionId="_sessionId"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <PortNumber>2</PortNumber> 
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr></UserDescr> 
        <SubscriberID></SubscriberID> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

Желаемая Вывод XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- Port Number removed-->     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

Фактический выход:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <Body> 
    <rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    message-id="81"> 
     <edit-config> 
     <target> 
      <url/> 
     </target> 
     <config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- want to remove this PortNumber completely--> 
       <PortNumber/>     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </config> 
      </edit-config> 
     </rpc> 
     </Body> 
    </Envelope> 
+0

** 1 ** Ваша проблема не может быть воспроизведена с помощью кода - см: HTTP: // XslTransform .net/94rmq7j - ** 2. ** В вашем XML-входе нет элемента 'grandParent', поэтому второй шаблон ничего не делает. –

+1

Спасибо, майкл, я очень новичок в этом, и по какой-то причине я должен заставить его работать как можно скорее. Я согласен с тем, что в онлайн-синтаксисе xslt это работает, но в среде, в которой я пытаюсь, и в каком-то конкретном инструменте, основанном на Java, он удаляет префиксы пространства имен. Любой указатель на то, что может пойти не так, или что мне нужно проверить. – Ramesh

+1

Я предполагаю, что вы знаете, что узлы вашего выходного документа все еще находятся в правильном пространстве имен (пространство имен не удалено *), и любой инструмент анализатора или XML-обработки должен работать независимо от того, задано ли пространство имен по умолчанию или задано пространство имен явно через префикс. –

ответ

2

Чтобы удалить элементы, которые не имеют никакого содержания, вы можете добавить правило шаблона

<xsl:template match="*[not(child::node())]"/>

Как уже отмечалось, потеря информации пространства имен является ошибкой в используемой toolchain. Я бы предложил (а) установить, какой именно инструмент используется, (б) проверить, существуют ли более поздние версии одних и тех же инструментов, в которых ошибка может быть исправлена; (c) не удалось, переместившись на другой XSLT-процессор и/или XML синтаксический анализатор.

Иногда самый простой способ выяснить, что используется процессор XSLT, чтобы добавить что-то вроде:.

<xsl:template match="/"> 
    <xsl:comment>Generated using <xsl:value-of select="system-property('xsl:vendor')"/></xsl:comment> 
    <xsl:apply-templates/> 
</xsl:template> 
Смежные вопросы