2013-04-15 2 views
2

Я новичок в XSL. Я пытаюсь читать значения элементов XML с помощью XSL-файла. Мой файл XML, как:Пытается прочитать значение элемента xml в xsl

<PersonList> 
    <Person> 
    <Name>person1</Name> 
    <Age>21</Age> 
    </Person> 
    <Person> 
    <Name>person2</Name> 
    <Age>21</Age> 
    </Person> 
</PersonList> 

Мой файл XSL, как:

<xsl:stylesheet version="1.0" xmlns=...> 
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml declaration="no" /> 
    <xsl template match="/"> 
    <PersonList> 
     <xsl:for-each select="PersonList/Person"> 
     <Person> 
      <xsl:for-each select="*"> 
      <xsl:variable name="elementName"> 
       <xsl:value-of select="name(.)" /> 
      </xsl:variable> 
      <xsl:variable name="elementValue"> 
       ??? 
      </xsl:variable> 
      </xsl:for-each> 
     </Person> 
     </xsl:for-each> 
    </PersonList> 
    </xsl:template> 
</xsl:stylesheet> 

Как следует заменить ???, чтобы получить значение элемента, хранящегося в переменной elementName. Я пробовал следующие три строки отдельно:

<xsl:value-of select="value(.)" /> 
<xsl:value-of select="value($elementName)" /> 
<xsl:value-of select="$elementName" /> 

но не повезло. Пожалуйста помоги!

+0

Рассмотрите возможность размещения XML-результата, который вы хотите создать с помощью XSLT для введенного вами примера ввода XML. С вашего примера XSLT трудно сказать, чего вы хотите добиться, поскольку у него есть синтаксические ошибки, такие как 'xsl template' и логические недостатки, такие как пустые' '' '' '' '' '' или '' name (.) ', Где узлом контекста является корневой узел. –

+0

Я исправил xsl. Пожалуйста, рассмотрите сейчас. Я хочу получить значения Person1, 21, Person2, 21 в переменной elementValue в цикле. – user1818397

+0

Вы должны действительно прочитать разницу между обработкой _pull_ (что вы делаете) и стилем _push_. Для такой задачи стиль push-style, где вы используете шаблоны и шаблоны приложений, намного более естественен и соответствует способу работы XSL-процессора. Похоже, вы просто пытаетесь скопировать ввод на вывод ... выполните поиск Google для «шаблона идентификации XSL». –

ответ

0

Ну, если вы действительно хотите, чтобы получить значение элемента, имя которого хранится в переменной, в вашем случае, вы могли бы сделать это, как этот

<xsl:variable name="elementValue"> 
    <xsl:value-of select="../*[name()=$elementName]" /> 
</xsl:variable> 

Но это значительно усложненной вопросы. Вы находитесь в xsl: for-each loop, итерации по дочерним элементам Лицо. Поэтому, поскольку вы уже позиционированы на элементе, для которого вы хотите получить значение, вы можете просто сделать это и забыть о переменной elementName.

<xsl:variable name="elementValue"> 
    <xsl:value-of select="."/> 
</xsl:variable> 

На самом деле, у вас может упростить петли только это

<xsl:for-each select="PersonList/Person"> 
    <Person> 
     <xsl:for-each select="*"> 
     <xsl:value-of select="." /> 
     </xsl:for-each> 
    </Person> 
</xsl:for-each> 
3

Ваш ?????????????????? может быть <xsl:value-of select="."/> (то есть строковое значение контекстного элемента.) Это не имеет никакого отношения к $elementName.

Вы можете сделать это гораздо более сжато, как это:

<xsl:for-each select="*"> 
    <xsl:variable name="elementName" select="name()"/> 
    <xsl:variable name="elementValue" select="string(.)"/> 
</xsl:for-each> 

Однако ваш шаблон действительно странно. Вы собираете эти переменные, но вы ничего не делаете с ними - они не появятся на выходе. Какой результат вы пытаетесь получить?

Использование for-each, как правило, является запахом кода. Почти во всех случаях вы лучше с несколькими шаблонами:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no" /> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Person/*"> 
    <xsl:variable name="elementName" select="name()"/> 
    <xsl:variable name="elementValue" select="string(.)"/> 
</xsl:template> 

</xsl:stylesheet> 

Эта модель, где вы копируете почти все и изменить только немного XML, является очень распространенным и очень мощным, и вы должны learn how to use it.

+0

Спасибо за ответ. Это не полный xsl.На самом деле мне нужно изменить xml в соответствии со значениями в элементах. – user1818397

+0

Рассматривали ли вы использование шаблонов вместо вложенных циклов 'for-each'? –

+0

Я новичок в xsl. Не много разбирайтесь в использовании шаблонов. – user1818397

Смежные вопросы