我将收到一个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的新手,不知道哪里出了问题,有人能帮忙吗。
您的方法有三个问题:
- 不能在匹配模式中使用变量
- 匹配模式必须包含XPath表达式;您正在传递一个字符串
- Remove_Elements_List不是根元素,因此表达式
/Remove_Elements_List
不选择任何内容
尝试替换此:
<xsl:template match="$Remove_Elements" />
带有:
<xsl:template match="*[local-name()=//Remove_Elements_List]"/>
注意,这假设:
- CCD_ 2元素包含一个元素名称,而不是人们可能认为的列表
- CCD_ 3元素不在名称空间中
编辑:
在某些情况下,我将接收由管状的
<Remove_Elements_List>isInJeopardy|orderId</Remove_Elements_List>
如何我能处理这个吗?
尝试:
<xsl:template match="*[contains(concat('|', //Remove_Elements_List, '|'), concat('|', local-name(), '|'))]"/>
请注意,总的来说,这不是一个好的系统。首先,<Remove_Elements_List>
列出的元素不考虑它们的名称空间或在输入树中的位置。另一方面,它的效率不是很高。