我将收到一个XML,它具有可变结构,但肯定会有一个字段,如
`
<Remove_Elements_List>isInJeopardy</Remove_Elements_List>
`
我应该使用此Remove元素的内容来识别传入xml中的标记并使用XSL将其删除我还应该删除Remove_Elements_List标记。
无论名称空间和元素深度如何,这都应该有效。
我写了像xslt
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:variable name="Remove_Elements" select="/Remove_Elements_List"></xsl:variable>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="$Remove_Elements" />
<xsl:template match="Remove_Elements_List" />
</xsl:stylesheet>
和xml就像
<web:Body xmlns:web="http://webservices.com" xmlns:bean="http://beans.com">
<Remove_Elements_List>isInJeopardy</Remove_Elements_List>
<web:terminateSubscriber>
<web:terminateSubscriberRequest>
<bean:accountNo>4638020</bean:accountNo>
<bean:acctExternalId>46380206</bean:acctExternalId>
<bean:actionCode>1</bean:actionCode>
<bean:annotation1></bean:annotation1>
<bean:annotation2></bean:annotation2>
<bean:annotation3></bean:annotation3>
<bean:changeWho>MyDomain</bean:changeWho>
<bean:disconnectReason>3</bean:disconnectReason>
<bean:emfConfigId>341</bean:emfConfigId>
<bean:equipStatus>1</bean:equipStatus>
<bean:externalId>venkat.com</bean:externalId>
<bean:itemDate>14-Oct-2014</bean:itemDate>
<bean:levelCode>2</bean:levelCode>
<bean:memberType>3</bean:memberType>
<bean:orderData>
<bean:auditTrail></bean:auditTrail>
<bean:changeWho></bean:changeWho>
<bean:departmentId></bean:departmentId>
<bean:elementId></bean:elementId>
<bean:fileId></bean:fileId>
<bean:isInJeopardy></bean:isInJeopardy>
<bean:orderId></bean:orderId>
<bean:orderIdResets></bean:orderIdResets>
<bean:orderRevNo></bean:orderRevNo>
<bean:orderStatus></bean:orderStatus>
<bean:orderUrgency></bean:orderUrgency>
<bean:owner></bean:owner>
<bean:parentMemberType></bean:parentMemberType>
<bean:provGroupId></bean:provGroupId>
<bean:serverId></bean:serverId>
<bean:subscrNo></bean:subscrNo>
<bean:subscrNoResets></bean:subscrNoResets>
<bean:supervisorId></bean:supervisorId>
<bean:technicianId></bean:technicianId>
<bean:trackingId></bean:trackingId>
<bean:trackingIdServ></bean:trackingIdServ>
</bean:orderData>
<bean:subscrNo>205135041</bean:subscrNo>
<bean:subscrNoResets>0</bean:subscrNoResets>
</web:terminateSubscriberRequest>
</web:terminateSubscriber>
</web:Body>
我是XSLT的新手并且无法弄清楚什么是错的,任何人都可以帮忙。
答案 0 :(得分:0)
您的方法存在三个问题:
/Remove_Elements_List
不会选择任何内容。尝试替换它:
<xsl:template match="$Remove_Elements" />
使用:
<xsl:template match="*[local-name()=//Remove_Elements_List]"/>
请注意,这假定:
Remove_Elements_List
元素包含一个元素名称 - 而不是人们可能认为的列表; Remove_Elements_List
元素不在命名空间中。在某些情况下,我将收到由a分隔的多个元素 管道像
<Remove_Elements_List>isInJeopardy|orderId</Remove_Elements_List>
如何 我可以处理吗?
尝试:
<xsl:template match="*[contains(concat('|', //Remove_Elements_List, '|'), concat('|', local-name(), '|'))]"/>
请注意,总体而言,这不是一个好的系统。首先,您的<Remove_Elements_List>
列出的元素不考虑其命名空间或它们在输入树中的位置。另一方面,效率不高。