2016-06-20 2 views
0

У меня есть xml из одной из наших «устаревших» систем. Я хочу удалить тег ExtLineNum, но он не находится в корне.Удалить тег xml на дополнительном узле

Я раздел XML для моего примера:

<?xml version="1.0" encoding="utf-8"?><ns0:Envelope xmlns:ns0="http://schemas.microsoft.com/dynamics/2008/01/documents/Message"><ns0:Header><ns0:MessageId>{F2BCADA1-AC26-4A0C-BA44-11D75E249150}</ns0:MessageId><ns0:SourceEndpointUser>du.msad\btshostinstance</ns0:SourceEndpointUser><ns0:SourceEndpoint>EDI</ns0:SourceEndpoint><ns0:DestinationEndpoint>JWR</ns0:DestinationEndpoint><ns0:Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesOrderService/create</ns0:Action><ns0:ConversationId /><ns0:RequestMessageId /></ns0:Header><ns0:Body><ns0:MessageParts><SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SalesTable class="entity"> 
    <ActionCode></ActionCode> 
    <SalesLine class="entity"> 
     <ExtLineNum></ExtLineNum> 
    </SalesLine> 
    </SalesTable> 
</SalesOrder></ns0:MessageParts></ns0:Body></ns0:Envelope> 

Я попытался:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="ExtLineNum"/> 

</xsl:stylesheet> 

Но это не сработало .. Угадайте, что это простой вопрос, но я не могу Найти ответ?

Спасибо заранее,

Майк

+0

Каков был результат действия вы пробовали? –

+0

Привет Wilko, Источник: Результат: ли не 'прикосновение' тег я думаю? –

+1

См. Http://stackoverflow.com/questions/34758492/xslt-transform-doesnt-work-until-i-remove-root-node/34762628#34762628 –

ответ

-1

Попробуйте соответствие родительский узел и пропустить внутренний узел с 'ExtLineNum' Node-Nam:

<xsl:template match="SalesLine"> 
    <xsl:copy-of select="*[node-name() != 'ExtLineNum']" /> 
</xsl:template> 
+0

Это не очень хороший ответ по нескольким пунктам: (a) синтаксис недействителен; (б) он не будет работать, потому что шаблон ничего не соответствует; (c) основная идея игнорировать пространство имен - это плохая практика. –

1

Благодарности к link предоставленной Майкла. hor257k Я нашел правильный синтаксис пространства имен:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:met="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder" 
exclude-result-prefixes="met"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="met:SalesOrder/met:SalesTable/met:SalesLine/met:ExtLineNum"/> 
</xsl:stylesheet> 

Thnx ребята за вашу помощь!

С наилучшими пожеланиями,

Майк

+1

'' должно быть достаточно (шаблон соответствия не совпадает с выбранным выражением). –