/ / Як зберегти префікс простору імен під час виконання обробки XSLT - xml, xslt, xslt-2.0

Як зберегти префікс простору імен при виконанні обробки XSLT - xml, xslt, xslt-2.0

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

  • Мені потрібно ВИДАЛИТИ всі теги, якщо вони не мають значення або пробілів. наприклад: видалити <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>

Відповіді:

2 для відповіді № 1

Щоб видалити елементи без вмісту, можна додати правило шаблону

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

Як зауважували інші, втрата простору іменінформація - це помилка в наборі інструментів, що використовується. Я б запропонував (а) встановити, який саме ланцюжок інструментів використовується, (б) перевірити, чи існують пізніші версії тих самих інструментів, в яких можливо виправлена ​​помилка, (в) якщо це не вдалося, перейти на інший процесор 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>