Найти узел в пути XML?

Как получить единственный дочерний узел?

<root>
 <p><span>text</span><span>text</span><span>text</span></p>
 <p><span>text</span></p>
 <p><span>text</span><span>text</span><span>text</span></p>
 <p><span>text</span></p>
</root>

например: /root/p/span

Я могу получить весь тег span и я могу найти первого ребенка или последнего ребенка или ребенка, но мне нужно найти один случайный случай случайным образом. Как я могу получить этот тег para по пути XML?

2 ответа

Основываясь на ваших разъяснениях, вы можете выбрать p элементов только в том случае, если они содержат ровно один элемент span.

<!--?xml version="1.0" encoding="utf-8"?-->

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes">

<xsl:template match="/">
 </xsl:template>

<xsl:template match="root">
 </xsl:template>

<xsl:template match="p[count(span)=1]">
 <xsl:copy>
 <xsl:copy-of select="*|text()">
 </xsl:copy-of></xsl:copy>
</xsl:template>

</xsl:output></xsl:stylesheet>

Входной XML, который я использовал:

<!--?xml version="1.0" encoding="utf-8"?-->

<root>
<p>
 <span>wrong</span>
 <span>wrong</span>
 <span>wrong</span>
</p>
<p>
 <span>right</span>
</p>
<p>
 <span>wrong</span>
 <span>wrong</span>
 <span>wrong</span>
</p>
<p>
 <span>right</span>
</p>
</root>

Выходной XML:

<!--?xml version="1.0" encoding="UTF-8"?-->

<p>
 <span>right</span>
</p>

<p>
 <span>right</span>
</p>


Случайный выбор элементов не является частью стандартного XSLT как такового, потому что он является функциональным языком. Другими словами, гарантируется, что вы получаете одинаковый выход для заданного ввода независимо от того, сколько раз вы пытаетесь.

Однако, если для вас важна случайность, используйте расширения для XSLT. Здесь предлагаются ответы:

Библиотеки Dimitre, на которые ссылаются, могут быть именно то, что вам нужно. Обратите внимание, что предварительным условием случайного присваивания является случайное число, и поэтому это является предметом обсуждения.

licensed under cc by-sa 3.0 with attribution.