如何使用XSLT根据XML节点属性值添加首尾注释?
如何用XSLT给指定属性值的XML节点添加首尾注释?
要实现给所有带id:num="A"属性的节点添加首尾注释,核心是在XSLT模板的match表达式里用XPath精准匹配目标节点,再在模板中输出注释和节点内容。
关键知识点
XPath中匹配带特定属性值的元素语法为:*[@前缀:属性名='目标值'],注意如果属性用了命名空间前缀(比如示例中的id:),必须在XSLT中声明对应的命名空间才能正确匹配。
完整XSLT示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:id="http://example.com/your-namespace-uri"> <!-- 替换为实际命名空间URI --> <!-- 身份模板:复制所有未被特殊模板匹配的节点/属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配所有带有id:num="A"属性的元素 --> <xsl:template match="*[@id:num='A']"> <!-- 输出前置注释 --> <xsl:comment>comment</xsl:comment> <!-- 复制当前节点(包括属性和子节点) --> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> <!-- 输出后置注释 --> <xsl:comment>comment</xsl:comment> </xsl:template> </xsl:stylesheet>
示例输入
<rootNode id:num="A"> <childNode>内容</childNode> </rootNode> <otherNode id:num="B"> <childNode>其他内容</childNode> </otherNode>
示例输出
<!--comment--><rootNode id:num="A"> <childNode>内容</childNode> </rootNode><!--comment--> <otherNode id:num="B"> <childNode>其他内容</childNode> </otherNode>
说明
- 命名空间声明:必须将
xmlns:id="http://example.com/your-namespace-uri"替换为XML文档中id前缀对应的实际命名空间URI,否则无法匹配到id:num属性。 - 身份模板:确保XML中未匹配到目标条件的节点和属性都会被原样复制,不影响其他内容。
- 目标模板:专门匹配符合
id:num="A"条件的元素,先输出前置注释,再复制节点本身及所有子内容,最后输出后置注释。
内容的提问来源于stack exchange,提问作者dina
相关产品推荐
相关产品推荐

