Xml 使用XSLT跳过具有属性的节点
这是我的示例xml。我想删除节点Xml 使用XSLT跳过具有属性的节点,xml,xslt,xslt-1.0,xslt-2.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,这是我的示例xml。我想删除节点 在第一个变体节点中。但是希望保留在第二个变体节点中,同时删除常规的空节点作为 <variation-attribute> <variation-attribute-values/> </variation-attribute> 表示如何跳过具有属性的节点 <ItemList> <Variation> <attributes>
在第一个变体节点中。但是希望保留在第二个变体节点中,同时删除常规的空节点作为
<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>
但它正在移除所有自动关闭标签。但是我想保留节点,就像
一样。如何使用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>
颜色
青铜
布尔泽大学
属性与节点()不匹配。
因此您需要将模板改为该节点
<xsl:template match="*/*[not(node()) and not(@*)]"/>
编辑:如果要在其所有子节点都为“空”时删除父节点,请尝试此表达式
<xsl:template match="*/*[not(descendant-or-self::*[@* or text()])]"/>
这将选择至少具有一个属性的所有变体节点
XDocument doc = XDocument.Load("TestFile.xml");
IEnumerable<XElement> elementList = doc.XPathSelectElements("ItemList/Variation[attributes/shared-variation-attribute[(@*)]]");
XDocument doc=XDocument.Load(“TestFile.xml”);
IEnumerable elementList=doc.XPathSelectElements(“项目列表/变体[属性/共享变体属性[(@*)])”;
同样,您可以使用
XDocument doc = XDocument.Load("TestFile.xml");
IEnumerable<XElement> elementList = doc.XPathSelectElements("ItemList/Variation[attributes/shared-variation-attribute[not(@*)]]");
XDocument doc=XDocument.Load(“TestFile.xml”);
IEnumerable elementList=doc.XPathSelectElements(“项目列表/变体[属性/共享变体属性[非(@*)])”;
选择没有任何属性的节点。我尝试了您的代码。但是仍然存在一个空节点,就像在第二个变量中一样。这个空节点仍然保留在输出xml中,因为这个层次结构在这种情况下该怎么办?那么,你是说如果父元素的所有子节点都为空,就要删除它吗?如果您编辑您的问题以显示您的预期输出,可能会有所帮助。非常感谢。嘿,蒂姆,我已经添加了预期输出。。你能建议我们在这种情况下能做些什么吗?我已经用另一种解决方案修改了我的答案以供尝试。问题已经修改了:(对不起,回答完问题后再换是不好的。
XDocument doc = XDocument.Load("TestFile.xml");
IEnumerable<XElement> elementList = doc.XPathSelectElements("ItemList/Variation[attributes/shared-variation-attribute[(@*)]]");