Это:
<xsl:variable name="matches" select="$set1[starts-with(., $set2)]"/>
установит $matches
на набор узлов, содержащий каждый узел в $set1
, текстовое значение которого начинается с текстового значения узла в $ set2. Это то, что вы ищете, верно?
Edit:
Ну, я просто ошибаюсь по этому поводу. Вот почему.
starts-with
ожидает, что два его аргумента будут строками. Если это не так, он преобразует их в строки перед оценкой функции.
Если вы задаете ему набор узлов в качестве одного из аргументов, он использует строковое значение набора узлов, которое является текстовым значением первого узла в наборе. Таким образом, в приведенном выше примере $set2
никогда не ищется; проверяется только первый узел в списке, поэтому предикат найдет только узлы в $set1
, начинающиеся со значения первого узла в $set2
.
Я был введен в заблуждение, потому что этот шаблон (который я часто использовал в последние несколько дней) работает :
<xsl:variable name="hits" select="$set1[. = $set2]"/>
Но этот предикат использует сравнение между наборами узлов, а не между текстовыми значениями.
Идеальный способ сделать это - использовать предикаты. То есть «Я хочу найти каждый узел в $set1
, для которого есть узел в $set2
, значение которого начинается с ...», и здесь XPath не работает. Начинается с чего? То, что вы хотели бы написать что-то вроде:
<xsl:variable name="matches" select="$set1[$set2[starts-with(?, .)]]"/>
только нет выражения, которое вы можете написать для ?
, который будет возвращать узел, в настоящее время тестируемый внешним предикатом. (Если я не пропускаю что-то ослепительно очевидное.)
Чтобы получить то, что вы хотите, вы должны протестировать каждый узел в отдельности:
<xsl:variable name="matches">
<xsl:for-each select="$set1">
<xsl:if test="$set2[starts-with(current(), .)]">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
Это не очень удачное решение, потому что оно оценивает фрагмент дерева результатов, а не набор узлов. Вам придется использовать функцию расширения (например, msxsl:node-set
) для преобразования RTF в набор узлов, если вы хотите использовать переменную в выражении XPath.