使用XSLT允许和删除元素



我将收到一个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的新手,不知道哪里出了问题,有人能帮忙吗。

您的方法有三个问题:

  1. 不能在匹配模式中使用变量
  2. 匹配模式必须包含XPath表达式;您正在传递一个字符串
  3. Remove_Elements_List不是根元素,因此表达式/Remove_Elements_List不选择任何内容

尝试替换此:

<xsl:template match="$Remove_Elements" />

带有:

<xsl:template match="*[local-name()=//Remove_Elements_List]"/>

注意,这假设:

  1. CCD_ 2元素包含一个元素名称,而不是人们可能认为的列表
  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>列出的元素不考虑它们的名称空间或在输入树中的位置。另一方面,它的效率不是很高。

相关内容

  • 没有找到相关文章

最新更新