Получить все <PRO>-Tag в разных слоях - PullRequest
2 голосов
/ 05 сентября 2011

Я получил XML-документ, подобный следующему:

<PUB>
   <PGR>
      <PGR>
         <PGR>
            <PRO>
            <PRO>
            <PRO>
         </PGR>
         <PRO>
         <PRO>
     ....

Итак, теги PRO находятся на разных уровнях, но я хочу получить доступ ко всем тегам PRO.Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Поскольку этот вопрос помечен XSLT, вы можете захотеть:

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

    <xsl:template match="/*">
        <xsl:apply-templates select=".//PRO"/>
    </xsl:template>

    <xsl:template match="PRO">
     <!-- enjoy PRO -->
    </xsl:template>

</xsl:stylesheet>

Обратите внимание, что в отличие от обычных ситуаций использование . при применении шаблонов здесь уместно .Фактически, таким образом, мы выбираем все элементы PRO , начиная с текущего соответствующего узла ( PUB ), в то время как:

   <xsl:apply-templates select="//PRO"/>

будет применять шаблоны ко всем PRO элементов, совпадающих с корнем документа, независимо от текущего узла.

1 голос
/ 05 сентября 2011

Используйте это выражение XPath :

//PRO

. Выбирает все элементы в документе XML с именем PRO.

. XPath 1.0 W3C Рекомендация ,

// - это сокращение от /descendant-or-self::node()/

Поэтому приведенное выше выражение XPath эквивалентнодлиннее:

/descendant-or-self::node()/PRO

Обычно рекомендуется по возможности избегать использования псевдооператора // , так как он вызывает сканирование всего XML-документа,Когда возможно.используйте как можно больше контекста для создания более конкретного выражения XPath, чтобы его можно было оценивать более эффективно.

Например, если в данном документе XML ясно, что можно выбрать требуемый элемент cиспользуя выражение XPath:

/a/b/c

используйте его и никогда не используйте:

//c

Разница в скорости выполнения иногда составляет порядка сотен или тысяч раз.

В качестве альтернативы, в XSLT используйте только сопоставление с шаблоном - это может быть самое короткое преобразование, которое обращается и обрабатывает все (и только) элементы PRO в любом документе XML:

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

 <xsl:template match="PRO">
  <!-- Your code here -->
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>
1 голос
/ 05 сентября 2011
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//PRO"/>
    </xsl:template>

    <xsl:template match="PRO">
        <xsl:value-of select="generate-id()"/>
        <xsl:text>&#xA0;</xsl:text>
    </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...