この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式で正しい結果が得られない可能性があります。
ID
属性に文字列"IF"
が正確に2回含まれている要素のみを選択する正確なXPath1.0式は次のとおりです。
/*/*
[contains(@ID, 'IF')
and contains(substring-after(@ID, 'IF'), 'IF')
and not(contains(
substring-after(substring-after(@ID, 'IF'),'IF'),
'IF')
)
]