Я пытался решить эту проблему некоторое время.
XML Пример:
<node>
<ID>123</ID>
<work>
<id>1</id>
<title>Engineer</title>
<description>
<short>short</short>
</description>
</work>
<work>
<id>2</id>
<title>Engineer</title>
<description>
<short>long</short>
</description>
</work>
</node>
XSLT 2.0 Пример:
<xsl:template name="answers">
<xsl:for-each select="//description">
<xsl:choose>
<xsl:when test="ancestor::node[ID='123']/work[2]/description/short">
//DO NOTHING.
</xsl:when>
<otherwise>
<description>
//CREATE OTHERS
</description>
</otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
Идея в том, чтобы создать новый шаблон для части "для каждого описания". Но я хочу только первое описание, потому что я напишу второе внутри первого. Поэтому мне не нужно ничего создавать для второго описания. Просто игнорируйте, когда это второе описание, которое имеет <short>
узел. Решение не может быть определено с использованием значения short='long'
. Поскольку язык или значение могут измениться, но позиция XPath всегда будет одинаковой.
Результат, который я получаю, с этим
long
long
Поэтому, когда я выполняю код, он также игнорирует первый узел, потому что они принадлежат одному и тому же ID='123'
, я думаю. Эта группа с тем же ID
может повторяться N раз. Как выбрать только второй work
узел description
, каждый повторяемый раз со значением "long"
по XPath, не основанный на текстовом значении.