首页 > 解决方案 > 在 XSLT 中,是否可以在具有 ID 的子代之前插入一个元素?

问题描述

我有一个特殊情况。在 xml 文档中,我想在每个具有 ID 的子元素之前插入一个特定元素。那可能吗?

我可以在不使用 xsl:copy 之前添加新元素的节点的情况下执行此操作。

XML 文档

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <ul>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
    <ul id='123'>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
</books>

预期结果

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <ul>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
    <anchor id="123"/>
    <ul id='123'>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
</books>

我可以在不使用的情况下做到这一点吗?具有 id 的元素将具有单独的模板。如果我使用 xsl:copy,则不会应用特定于元素的模板。您的帮助将不胜感激。提前致谢。

标签: xslt

解决方案


您可以使用以下方法轻松实现您显示的结果:

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="ul[@id]">
    <anchor id="{@id}"/>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

如果您有用于处理其他元素的特定模板,您可以添加它们并且它们将被应用。


推荐阅读