使用XSLT

时间:2015-10-08 08:16:39

标签: xml xslt xslt-1.0 xslt-2.0

这是我的示例xml。我想删除节点 <shared-variation-attribute/>  在第一个变异节点中。但希望保留在第二个变体节点以及删除常规空节点

 <variation-attribute>
 <variation-attribute-values/>
 </variation-attribute>

表示如何跳过具有属性的节点

<ItemList>
       <Variation>
          <attributes>
             <shared-variation-attribute/>
             <variation-attribute attribute-id="Colour" att-id="Colour">
                <display-name>Colour</display-name>
                <variation-attribute-values>
                   <variation-attribute-value value="Bronze">
                      <display-value>Bronze</display-value>
                   </variation-attribute-value>
                   <variation-attribute-value value="BRZE UNI EMBELLISSEU">
                      <display-value>BRZE UNI EMBELLISSEU</display-value>
                   </variation-attribute-value>
                </variation-attribute-values>
             </variation-attribute>
          </attributes>
          <Variants>
             <variant product-id="124451575"/>
          </Variants>
       </Variation>
       <Variation>
          <attributes>
             <shared-variation-attribute variation-attribute-id="Colour" attribute-id="Colour"/>
             <variation-attribute>
                <variation-attribute-values/>
             </variation-attribute>
          </attributes>
          <Variants>
             <variant product-id="180003356"/>
             <variant product-id="180003372"/>
             <variant product-id="180003364"/>
             <variant product-id="180003380"/>
             <variant product-id="180003398"/>
          </Variants>
       </Variation>
    </ItemList>

我尝试了这样的代码:

    <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="*/*[not(node())]"/>
</xsl:stylesheet>

但它正在移除所有自闭标签。但我想保持节点像<variant product-id="180003372"/>。如何使用XSLT实现这一目标

预期输出如下:

    <ItemList>
   <Variation>
      <attributes>
         <variation-attribute attribute-id="Colour" att-id="Colour">
            <display-name>Colour</display-name>
            <variation-attribute-values>
               <variation-attribute-value value="Bronze">
                  <display-value>Bronze</display-value>
               </variation-attribute-value>
               <variation-attribute-value value="BRZE UNI EMBELLISSEU">
                  <display-value>BRZE UNI EMBELLISSEU</display-value>
               </variation-attribute-value>
            </variation-attribute-values>
         </variation-attribute>
      </attributes>
      <Variants>
         <variant product-id="124451575"/>
      </Variants>
   </Variation>
   <Variation>
      <attributes>
         <shared-variation-attribute variation-attribute-id="Colour" attribute-id="Colour"/>
      </attributes>
      <Variants>
         <variant product-id="180003356"/>
         <variant product-id="180003372"/>
         <variant product-id="180003364"/>
         <variant product-id="180003380"/>
         <variant product-id="180003398"/>
      </Variants>
   </Variation>
</ItemList>

2 个答案:

答案 0 :(得分:0)

属性与node()不匹配,因此您需要将模板更改为此....

<xsl:template match="*/*[not(node()) and not(@*)]"/>

编辑:如果要删除父节点,如果它的所有后代节点都是“空”,那么请尝试使用此表达式

<xsl:template match="*/*[not(descendant-or-self::*[@* or text()])]"/>

答案 1 :(得分:0)

这将选择所有Variation节点,这些节点至少有一个属性。

XDocument doc = XDocument.Load("TestFile.xml");
IEnumerable<XElement> elementList = doc.XPathSelectElements("ItemList/Variation[attributes/shared-variation-attribute[(@*)]]");

同样可以使用

XDocument doc = XDocument.Load("TestFile.xml");
IEnumerable<XElement> elementList = doc.XPathSelectElements("ItemList/Variation[attributes/shared-variation-attribute[not(@*)]]");

选择没有任何属性的节点。