Предок XPath и потомок в копии XSL -

Я плохо знаком с 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>

Кто-то может объяснить предка и порожденные оси мне более полезным способом, чем учебные руководства, которые я ранее прочитал?

Спасибо!

5
задан developer 1 June 2010 в 18:53
поделиться

2 ответа

И у меня есть следующий XSL:

 < xsl: template match = "/">
 

Когда это преобразование применяется к предоставленному XML-документу, получается требуемый результат :

<file>
<criteria>
</criteria>
</file>
5
ответ дан 14 December 2019 в 13:27
поделиться

предок предназначен для выбора узлов, которые находятся выше (ближе к корню) в 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 определяет узлы, и простые копии не будут копировать элементы, содержащие выбранные вами элементы. Я могу прояснить этот момент подробнее, если вы все еще не уверены.

1
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: