【问题标题】:how do i keep only required elements in an XML using XSLT如何使用 XSLT 在 XML 中仅保留必需的元素
【发布时间】:2021-01-20 12:42:29
【问题描述】:

我有一个下面给定的输入 xml,我想在其中 复制 元素 event:businessevent:Order 但只有 common:AddListcommon:Date 在 event:Order 下而不是将所有元素都放入我的最终 xml p>

输入 XML:-

<event:Event>
   <event:EventDetails>

      <event:Order>
          <common:Date>2021-01-19T13:15:40.526Z</common:Date>

          <common:AddList>
            <common:AddData content="blah blah" key="blahblah"/>
            <common:AddData content="blah blah" key="blahblah"/>
          </common:AddList>

         <data:User>
              <data:Key>1</data:Key>
         </data:User>

     </event:Order>

     <event:business>
         <common:Legacy>
                <common:TA>1</common:TA>
         </common:Legacy>
     </event:business>

   </event:EventDetails>
</event:Event>

我能够使用以下 XSLT 代码成功复制 event:business 以及整个 event:Order 。但它不适合我的用例,因为我实际上只需要在 event:Order 下挑选几个元素,如 common:AddList 和 common:Date。最好的方法是什么?

XSLT:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.example.com/ns#"
    version="1.0">

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

     <xsl:template match="event:EventDetails" xmlns:event="blah blah">
        <xsl:copy>
            <xsl:apply-templates select="event:business" xmlns:event="blah blah"/>
            <xsl:apply-templates select="event:Order" xmlns:common="blah blah"/>  
        </xsl:copy>
     </xsl:template>
     
     
      <xsl:template match="@*|node()" >    
                                         <xsl:copy>      
                                          <xsl:apply-templates select="@*|node()"/>    
                                           </xsl:copy>   
                                       </xsl:template> 

</xsl:stylesheet>

预期的 XML 输出:-

<event:Event>
   <event:EventDetails>

      <event:Order>
          <common:Date>2021-01-19T13:15:40.526Z</common:Date>

          <common:AddList>
            <common:AddData content="blah blah" key="blahblah"/>
            <common:AddData content="blah blah" key="blahblah"/>
          </common:AddList>

     </event:Order>

     <event:business>
         <common:Legacy>
                <common:TA>1</common:TA>
         </common:Legacy>
     </event:business>

   </event:EventDetails>
</event:Event>

【问题讨论】:

  • XML 使用命名空间前缀:eventcommon。您似乎缺少它们的命名空间声明。

标签: xml xslt xpath filter transformation


【解决方案1】:

使用你拥有的身份转换

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

作为起点,然后用例如阻止你不需要的元素

<xsl:template match="event:Order/*[not(self::common:Date | self::common:AddList)]"/>

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多