使用这个 XPath 表达式:
/*/*
[translate(@ID, translate(@ID, 'IF', ''), '')='IFIF']
基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*
[translate(@ID, translate(@ID, 'IF', ''), '')='IFIF']
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<IOCFG xmlns="http://www.br-automation.com/AR/IO" Version="2.0">
<Module ID="$root.IO" Hardware="X20CP1484">
</Module>
<Module ID="$rot.IO" Hardware="X20CP1484">
</Module>
<Module ID="$rt.IO" Hardware="X20CP1484">
</Module>
**<Module ID="IF3.IF1.ST9" Hardware="Hello"/>**
<Module ID="IF3.IF2.IF3.ST9" Hardware="Bye"/>
**<Module ID="IF3.IF2.ST1" Hardware="hai"/>**
</IOCFG>
计算 XPath 表达式并将所选元素复制到输出:
<Module xmlns="http://www.br-automation.com/AR/IO" ID="IF3.IF1.ST9" Hardware="Hello"/>
<Module xmlns="http://www.br-automation.com/AR/IO" ID="IF3.IF2.ST1" Hardware="hai"/>
请注意:
这是一个粗略的解决方案,假设属性的值ID
具有某些属性(如在提供的 XML 中)。如果这个假设被打破,相同的 XPath 表达式可能不会产生正确的结果。
一个精确的 XPath 1.0 表达式只选择其ID
属性"IF"
恰好包含两次字符串的元素:
/*/*
[contains(@ID, 'IF')
and contains(substring-after(@ID, 'IF'), 'IF')
and not(contains(
substring-after(substring-after(@ID, 'IF'),'IF'),
'IF')
)
]