Я плохо знаком с XPath, и от того, что я считал в некоторых учебных руководствах об осях, меня все еще оставляют, задаваясь вопросом, как реализовать их. Они не вполне ведут себя, как я ожидал. Я особенно интересуюсь использованием предка и порожденных осей.
У меня есть следующая структура XML:
<file>
<criteria>
<root>ROOT</root>
<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>CCC</criterion>
</criteria>
<format>
<sort>BBB</sort>
</format>
</file>
И у меня есть следующий XSL:
<xsl:template match="/">
<xsl:copy-of select="ancestor::criterion/>
</xsl:template>
который ничего не производит!
Я ожидал, что это произведет:
<file>
<criteria>
</criteria>
</file>
Кто-то может объяснить предка и порожденные оси мне более полезным способом, чем учебные руководства, которые я ранее прочитал?
Спасибо!
И у меня есть следующий XSL:
< xsl: template match = "/">
Когда это преобразование применяется к предоставленному XML-документу, получается требуемый результат :
<file> <criteria> </criteria> </file>
предок
предназначен для выбора узлов, которые находятся выше (ближе к корню) в XML-документе. Потомок
предназначен для выбора более низких узлов (дочерних) в документе XML.
В вашем примере ancestor :: criterion
ничего не выбирает, потому что текущий узел - /
(что означает корень документа - <файл>
в этом case), на что указывает match = "/"
. У корневого узла нет предков, поэтому ось предок
ничего не делает.
Чтобы получить каждый элемент
, вы должны использовать ось потомка
:
<xsl:template match="/">
<xsl:copy-of select="descendant::criterion"/>
</xsl:template>
или ее ярлык //
:
<xsl:template match="/">
<xsl:copy-of select="//criterion"/>
</xsl:template>
Это будет верните следующее:
<criterion>AAA</criterion>
Используя цикл или другой шаблон, вы можете получить все три из них:
<xsl:template match="/">
<file>
<xsl:apply-templates select="//criterion"/>
</file>
</xsl:template>
<xsl:template match="criterion">
<xsl:copy-of select="."/>
</xsl:template>
Это даст следующее:
<file>
<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>CCC</criterion>
</file>
Если вы хотите получить элемент
, тоже все немного сложнее. XPath определяет узлы, и простые копии не будут копировать элементы, содержащие выбранные вами элементы. Я могу прояснить этот момент подробнее, если вы все еще не уверены.