xml の例は次のとおりです。
<a amp="a"><b><c>this is the text</c></b></a>
次のように変換する必要があります。
<a amp="a"><c>this is the text</c></a>
解決策 #1:要素の属性を保持するsmaccounの解決策をわずかに改善しc
ます (たとえば、XML では必要ありません):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="c">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
解決策 #2組み込みのテンプレート rulesを活用する別の方法で、すべての要素に apply-templates を適用し、すべてをコピーしますtext()
。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--identity template for the c element, it's decendant nodes,
and attributes (which will only get applied from c or
descendant elements)-->
<xsl:template match="@*|c//node()|c">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
解決策 #3:変更された恒等変換:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--identity template, copies all content by default-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--don't generate content for these matched elements,
just apply-templates to it's children-->
<xsl:template match="a|b">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
解決策 #4必要なものがわかっている場合は、ルート ノードの一致からコピーするだけです
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:copy-of select="a/b/c" />
</xsl:template>
</xsl:stylesheet>
入力から要素を単純に削除したい場合は、テンプレートをその子に適用するだけ<b>
の要素に一致するテンプレートを使用して、変更された恒等変換を使用する必要があります。<b>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--identity template, copies all content by default-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--don't generate content for the <b>, just apply-templates to it's children-->
<xsl:template match="b">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
テンプレートを適用し<c>
、コピー デザイン パターンを使用するだけです。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match='c'>
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>