【问题标题】:XSLT - Remove full parent node if child contains specific textXSLT - 如果子节点包含特定文本,则删除完整的父节点
【发布时间】:2013-09-02 13:50:26
【问题描述】:

我只需要将一个 XML 文件转换为另一个包含所需数据的 XML 文件。 如果子节点不包含正确的类别,则转换会删除所有父节点。

输入 XML:

    <SHOP>
    <SHOPITEM>
        <ITEM_ID>142</ITEM_ID>
        <PRODUCT>Mora MV 1251</PRODUCT>
        <DESCRIPTION>XXXXX</DESCRIPTION>
        <URL>http://www.xxx.sk/o</URL>
        <IMGURL>http://xxx.jpg</IMGURL>
        <PRICE>6.74</PRICE>
        <PRICE_VAT>8.10</PRICE_VAT>
        <VAT>0.20</VAT>
        <MANUFACTURER>Mora</MANUFACTURER>
        <CATEGORYTEXT>Accessories / Mobile</CATEGORYTEXT>
        <EAN>8590371028526</EAN>
        <PRODUCTNO></PRODUCTNO>
        <WARRANTY>24</WARRANTY>
        <DELIVERY_DATE>24</DELIVERY_DATE>
    </SHOPITEM>

    <SHOPITEM>
       <ITEM_ID>XXX</ITEM_ID>
       <PRODUCT>Hyundai LLF 22924 DVDR</PRODUCT>
       <DESCRIPTION>XXXXX</DESCRIPTION>
       <URL>http://www.xxx.sk/t</URL>
       <IMGURL>http://xxx.jpg</IMGURL>
       <PRICE>173.35</PRICE>
       <PRICE_VAT>208.00</PRICE_VAT>
       <VAT>0.20</VAT>
       <MANUFACTURER>Hyundai</MANUFACTURER>
       <CATEGORYTEXT>Main category / TVs</CATEGORYTEXT>
       <EAN>xxxxx</EAN>
       <PRODUCTNO/>
       <WARRANTY>24</WARRANTY>
       <DELIVERY_DATE>99999</DELIVERY_DATE>
    </SHOPITEM>
    </SHOP>

我需要删除 CATEGORYTEXT 不是主类别/电视的每个 SHOPITEM 节点

我有以下 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

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

 <xsl:template match="CATEGORYTEXT[not(text() = 'Main category / TVs')]"/>
</xsl:stylesheet>

但这只会删除 CATEGORYTEXT 节点,而不是完整的 SHOPITEM 节点。 任何人都可以帮助我吗? :) 我也是 XSLT 新手,不胜感激。

期望的输出是:

       <SHOP>
         <SHOPITEM>
           <ITEM_ID>XXX</ITEM_ID>
           <PRODUCT>Hyundai LLF 22924 DVDR</PRODUCT>
           <DESCRIPTION>XXXXX</DESCRIPTION>
           <URL>http://www.xxx.sk/t</URL>
           <IMGURL>http://xxx.jpg</IMGURL>
           <PRICE>173.35</PRICE>
           <PRICE_VAT>208.00</PRICE_VAT>
           <VAT>0.20</VAT>
           <MANUFACTURER>Hyundai</MANUFACTURER>
           <CATEGORYTEXT>Main category / TVs</CATEGORYTEXT>
           <EAN>xxxxx</EAN>
           <PRODUCTNO/>
           <WARRANTY>24</WARRANTY>
           <DELIVERY_DATE>99999</DELIVERY_DATE>
         </SHOPITEM>
       </SHOP>

【问题讨论】:

    标签: xslt-1.0


    【解决方案1】:

    替换这个

    <xsl:template match="CATEGORYTEXT[not(text() = 'Main category / TVs')]"/>
    

    用这个:

    <xsl:template match="SHOPITEM[not(CATEGORYTEXT = 'Main category / TVs')]"/>
    

    您当前的模板根据 CATEGORYTEXT 元素的文本节点子元素的值过滤它们,而您需要的是根据 CATEGORYTEXT 元素子元素的值过滤 SHOPITEM 元素。

    请注意,您实际上很少需要在 XPath 表达式中使用 text() - text() 为您提供了一个 set 的所有单个文本节点,这些节点是您正在处理的元素,而通常您关心的是元素本身的完整字符串值(根据定义,它是所有后代文本节点的串联)

    【讨论】:

    • 感谢您的成功! :) 你能帮我如何用 XSLT 删除空行吗?
    • @user2739916 哪些空行? strip-spaceoutput indent="yes" 的组合应该会自动处理。
    • 我想通了 :) 但你更快。谢谢您的帮助!您需要添加以下行:
    • @user2739916 啊,是的,我看到你之前在xsl:output 上缺少method 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多