xml 的递归复制部分并在副本上应用模板
Recursive copy part of xml and apply templates on the copy
我有下一个XML。
下一个问题。我为 weneedit 节点的 children 制作了模板。
我需要删除所有排除 weneedit 和他的 children。
我无法同时应用模板和进行递归复制。
<?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>
我不确定我理解你的问题。以下样式表:
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.
中是不允许的
我有下一个XML。 下一个问题。我为 weneedit 节点的 children 制作了模板。 我需要删除所有排除 weneedit 和他的 children。 我无法同时应用模板和进行递归复制。
<?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>
我不确定我理解你的问题。以下样式表:
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.