使用XSLT允许和删除元素

时间:2014-10-19 09:28:13

标签: xml xslt-1.0

我将收到一个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 个答案:

答案 0 :(得分:0)

您的方法存在三个问题:

  1. 您不能在匹配模式中使用变量;
  2. 匹配模式必须包含 XPath表达式;你传递的是字符串;
  3. Remove_Elements_List不是根元素,因此表达式/Remove_Elements_List不会选择任何内容。
  4. 尝试替换它:

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

    使用:

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

    请注意,这假定:

    1. Remove_Elements_List元素包含一个元素名称 - 而不是人们可能认为的列表;
    2. Remove_Elements_List元素不在命名空间中。

    3. 编辑:

        

      在某些情况下,我将收到由a分隔的多个元素   管道像   <Remove_Elements_List>isInJeopardy|orderId</Remove_Elements_List>如何   我可以处理吗?

      尝试:

      <xsl:template match="*[contains(concat('|', //Remove_Elements_List, '|'), concat('|', local-name(), '|'))]"/>
      

      请注意,总体而言,这不是一个好的系统。首先,您的<Remove_Elements_List>列出的元素不考虑其命名空间或它们在输入树中的位置。另一方面,效率不高。