我有下一个XML。 下一个问题。我为weneedit节点的孩子做了寺庙。 我需要删除所有排除weneedit和他的孩子。 我无法应用模板并一起进行递归复制。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<list>
<element>
<subelement>123</subelement>
</element>
<element>
<subelement>
<weneedit>
<andit>
<helpfultext>
</helpfultext>
</andit>
</weneedit>
</subelement>
</element>
</list>
<tag>
<rt>321</rt>
</tag>
</root>
我尝试过这样做
<xsl:stylesheet version="2.0"
xpath-default-namespace="http://www.w3.org/1999/xhtml"
xmlns:n="http://www.example.com/example/example.xsd" >
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="n:weneedit">
<xsl:copy-of select="parent::node()"/>
</xsl:template>
</xsl:stylesheet>
但不能合作一个或其他模板
我希望得到类似的东西
<subelement>
<weneedit>
<andit>
<helpfultext>it was edited</helpfultext>
</andit>
</weneedit>
</subelement>
答案 0 :(得分:0)
我不确定我理解你的问题。下面的样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root">
<xsl:apply-templates select="list/element/subelement[weneedit]"/>
</xsl:template>
</xsl:stylesheet>
将导致:
<?xml version="1.0" encoding="UTF-8"?>
<subelement>
<weneedit>
<andit>
<helpfultext/>
</andit>
</weneedit>
</subelement>
您可以添加其他模板来处理包含的节点,例如<helpfultext>
。
请注意,这假设只有一个<subelement>
包含<weneedit>
;否则你的结果将有多个根元素,这在XML中是不允许的。