Считать повторное значение узла в XSLT - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь преобразовать XML в HTML, используя XSLT.В этой области мне нужно прочитать повторяющиеся значения узлов.

Рассмотрим этот сценарий

<root>
  <test>
  <ID> 123 <</ID>
  <Name> MyName </Name>
  <Country> India </Country>
  <Books>
     <language> C </language>
     <language> C++ </language>
     <language> Java </language>
     <language> XML </language>
  </Books>
</root>

В этом примере я могу прочитать все значения узлов, например

   <xsl:value-of select="ID">

кроме "языкового" узла.Мне нужен вывод, как C C ++ Java XML.Любая идея ????

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Использование :

string(/*/*/Books)

Это выражение XPath оценивается как строковое значение первого (в вашем случае есть только один) Books элемента, который является дочерним по отношению к любому элементу, который является дочерним верхнего элемента XML-документа.

По определению строковое значение элемента является объединением (в порядке документа) всех его потомков текстовых узлов.

Полный код :

<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:value-of select="string(/*/*/Books)"/>
 </xsl:template>
</xsl:stylesheet>

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

<root>
    <test>
        <ID> 123 </ID>
        <Name> MyName </Name>
        <Country> India </Country>
        <Books>
            <language> C </language>
            <language> C++ </language>
            <language> Java </language>
            <language> XML </language>
        </Books>
    </test>
</root>

вычисляется выражение XPath и выводится результат :

 C  C++  Java  XML 
0 голосов
/ 24 января 2012

Вот несколько указателей, но на самом деле, я настоятельно рекомендую вам потратить пару часов, работая над приличным учебным пособием, таким как http://www.w3schools.com/xsl/

Во-первых, как отметил Дмитрий, ваш XML не очень хорошо сформирован.Я немного удивлен, что ваш XSLT-парсер не расстроился по этому поводу.У вас есть открывающий тестовый тег, который никогда не закрывается, и дополнительный <в вашем закрывающем теге Id.Кроме того, ваше значение-выражение не закрыто должным образом </p>

Во-вторых, вы говорите: «В этом примере я могу прочитать все значения узла, как ...». Этот вид не имеет смысла, не видяостальная часть вашего кода, и я предполагаю, что это выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/root">
    <xsl:value-of select="ID"/>
</xsl:template>    
</xsl:stylesheet>

Очень важно понять, что означает бит соответствия xsl: template, если вы собираетесь писать XSLT.XSLT обрабатывает ваш документ по частям, применяя правила, которые вы ему даете, чтобы превратить входной документ в выходной документ.

На каждом этапе вам нужно знать, где он выглядит в документе.Это известно как «контекст».В приведенном выше коде правило применяется, когда оно попадает в / root.Это означает, что вещь в угловых скобках, называемая корнем, не имеет вложенной вещи в угловых скобках.

Учитывая этот контекст, выражения XSLT относятся к нему.Это немного похоже на пути к каталогам DOS.Если вы не знаете текущий каталог, относительные пути к файлам мало что значат.

Так что в вашем примере select = "ID" означает значение тега ID, являющегося дочерним для текущего контекста, т.е.root / ID.

Ваш вопрос был как к элементу языка.Что ж, если контекст движка - / root, то вам нужно перейти к книгам, а затем снова к языку, чтобы выражение было ID / books / language

Впрочем, если вы пытаетесь изучать XSLT, то это хорошо для вас.Это не так сложно, и это чрезвычайно мощный язык для обработки XML.

0 голосов
/ 24 января 2012
<xsl:for-each select="Books/language">
 <xsl:value-of select "." />
 <xsl:text> </xsl:text>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...