Использование :
//page[@id=$yourId]/node()[not(self::page)]
Выбирает все узлы, которые не являются page
и являются потомками любого page
в документе, строковое значение которого id
Атрибут равен строке, содержащейся в $yourId
(скорее всего, вы бы заменили $yourId
выше конкретной, желаемой строкой, такой как '1'
).
Вот простой XSLTпроверка на основе :
<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:param name="pId" select="3"/>
<xsl:template match="/">
<xsl:copy-of select="//page[@id=$pId]/node()[not(self::page)]"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к предоставленному XML-документу (заключенному в один верхний узел, чтобы сделать его правильно сформированным):
<pages>
<page id='1'>
<title>Page 1</title>
<page id='2'>
<title>Sub Page 1</title>
</page>
<page id='3'>
<title>Sub Page 2</title>
</page>
</page>
<page id='4'>
<title>Page 2</title>
</page>
</pages>
получен требуемый, правильный результат :
<title>Sub Page 2</title>
Примечание : Одно из предположений состоит в том, что значение id
однозначно определяетpage
.Если это не так, предлагаемое выражение XPath выберет все page
элементов, чей атрибут id
имеет строковое значение $yourId
.
Если это так и толькодолжен быть выбран один элемент page
, OP должен указать, какой из множества элементов page
с этим id
должен быть выбран.
Например, это может быть первый :
(//page[@id=$yourId]/node()[not(self::page)])[1]
или последний :
(//page[@id=$yourId]/node()[not(self::page)])[last()]
или ...