В XSLT 2.0 используются стандартные функции XPath starts-with()
и ends-with()
.
InВ Xpath 1.0 нет функции ends-with()
, поэтому вам нужно использовать эквивалентное выражение XPath 1.0.
I.Решение XPath 1.0 / XSLT 1.0 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"*/data[@name[starts-with(.,'tag')
and
substring(., string-length(.)-11) = 'DescRes.Text'
]
]
"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному фрагменту XML (создал правильно сформированный документ XML, поместив его в один верхний элемент):
<t>
<data name="tagoneCtrlNumberRes.Text" xml:space="preserve">
<value>1.</value>
<comment>A01</comment>
</data>
<data name="tagoneCtrlDescRes.Text" xml:space="preserve">
<value>Hello</value>
<comment>A01</comment>
</data>
<data name="tagoneCtrlNoteRes.Text" xml:space="preserve">
<value>Hi</value>
<comment>A01</comment>
</data>
</t>
дает требуемый, правильный результат :
<data name="tagoneCtrlDescRes.Text" xml:space="preserve">
<value>Hello</value>
<comment>A01</comment>
</data>
Объяснение : XPath 1.0 эквивалент ends-with($s, $end)
:
substring($s, string-length($s) - string-length($end) +1) = $end
II.Решение XPath 2.0 / XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:sequence select=
"*/data[@name[starts-with(.,'tag')
and
ends-with(.,'DescRes.Text')
]
]
"/>
</xsl:template>
</xsl:stylesheet>
Здесь мы используем стандартную функцию Xpath 2.0 ends-with()