xslt - 在 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 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>
如果您有用于处理其他元素的特定模板,您可以添加它们并且它们将被应用。
推荐阅读
- mysql - 我应该标准化数据库中的时间记录吗?
- tomcat - 亚马逊 ec2 centos 上的 Essl epush 服务器设置问题
- java - 为什么compareByValue 方法不起作用?
- cuda - 在 CUDA 中找到第一个非零元素
- loops - 优化具有 While 循环和交叉应用的 T-SQL 查询
- aframe - gltf 文件在 aframe 中呈现不正确
- sql - 通过省略 UNION ALL 来简化查询或重写查询?
- python - 关于 ssl 认证错误,我想进行网页抓取但遇到错误
- c# - 输入值后如何清除验证消息
- android - ImageCaptureConfig.Builder() 显示错误