и я использую следующий шаблон XSL после определения, если узел
имеет детей:
<xsl:template name="hasChildren">
<tr>
<td colspan="2" class="sectionTitle">
<xsl:value-of select="translate(local-name(), '_', ' ')" />
</td>
</tr> ...
</xsl:template>
Этот код не выполняет то, что, как говорят, делает!
I'm testing if the current node has an attribute of `p` with `<xsl:if test="@p">` but I'm not sure how I could find if the node's children has a `p`.
Используйте
*[@p]
Это выражение XPath выбирает любой дочерний элемент (текущего узла), имеющий атрибут p
. При использовании в атрибуте test
<xsl:if>
или <xsl:when>
выбранный набор узлов преобразуется в логическое значение: true()
, если набор узлов не пуст, и false()
в противном случае.
Для приведенного выше примера XML я бы хотел игнорировать <record_group_2>
потому что это дети не содержат атрибут р, где как
<record_group_1>
Я бы хотел обработать
Используйте : только вышеприведенное выражение.
Вот полное и очень простое и короткое преобразование , которое копирует на выход только те дочерние элементы верхнего элемента, которые имеют атрибут p
:
<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>
<xsl:copy-of select="*[*/@p]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):
<record>
<d989 p="Apples" t="Apples"/>
<d990 p="Oranges" t="Bananas"/>
<record_group_1>
<d991 p="Mouse" t="Mouse and Cat"/>
<d991 p="Dog" t="Dog and Cat"/>
</record_group_1>
<record_group_2>
<d992 />
</record_group_2>
</record>
требуемый, правильный результат (удаляются не верхние элементы, у которых хотя бы один дочерний элемент не имеет атрибута p
) * Производится 1048 * :
<record>
<record_group_1>
<d991 p="Mouse" t="Mouse and Cat"/>
<d991 p="Dog" t="Dog and Cat"/>
</record_group_1>
</record>