Следующий XPath выберет атрибут обсуждения тип = = foo и содержащий текст «Обсуждение как T50» (когда $ topicid = 50).
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
Для конкретного элемента обсуждения соответствующийидентификатор задается как:
substring-after(normalize-space(.),' as Discussion ')
Мы можем объединить 2, заменив "."во втором выражении со всем первым выражением.Обратите внимание, что если несколько обсуждений соответствуют внутреннему выражению, мы сопоставим их значения со вторым.
substring-after(normalize-space(
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
),' as Discussion ')
Если было несколько совпадающих обсуждений, вы можете обработать их следующим образом:
<xsl:for-each select="//topics/topic">
<xsl:variable name="topicid" select="@id" />
<xsl:for-each select="//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]">
<xsl:variable name="relatedid" select="substring-after(normalize-space(.),' as Discussion ')" />
<!-- do something with $topicid and $relatedid -->
</xsl:for-each>
</xsl:for-each>
Ссылки на функции:
Лично я не могу себе представить серьезную разработку XSLT без книги Майкла Кея.