2010-04-08 1 views
0

Мой XML-файл RDF-то вроде этого ..Чтение несколько экземпляров тега или элемента с помощью XSLT

<rdf:RDF> 
    <rdf:Description rdf:about="........"> 
     <j.0:property rdf:resource="....."/> 
     <j.0:property rdf:resource=....."/> 
     <j.0:property rdf:resource="........"/> 
    </rdf:Description> 
</rdf:RDF> 

Теперь в моей таблицы стилей XSLT Мне нужно получить значения всех j.0:property тегов. Я использую что-то вроде этого:

<xsl:apply-templates select="j.0:property"/> 

<xsl:template match="j.0:property"> 
     <xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert /@rdf:resource"/></xsl:text>  
</xsl:template> 

Но тогда он возвращает то же значение 3 раза. Значение, являющееся значением первого найденного свойства. Просьба помочь мне понять, как я могу получить значение для каждого свойства.

+0

@shashank saket: выберите один из вопросов, которые нужно использовать, и опустите другой. Если вы не можете отказаться, добавьте немного строки поверх вашего другого вопроса, указывающего на другой, как дубликат. Это делает сайт чистым (ваш двойной q .: http://stackoverflow.com/questions/2597887/xslt-reading-multiple-instances-of-a-tag). – Abel

ответ

4

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

<xsl:value-of select="@rdf:resource"/> 

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

+0

СПАСИБО ВАМ !!!! Это сработало ... удивительно !! –

+0

Это относится к тегу , где в действительности вопрос не использует относительный путь, а абсолютный, что приводит к первому совпадению, используемому для значения. –

+0

Обратите внимание, что 'xsl: value-of' не может использоваться внутри' xsl: text', как я также объяснил в своем ответе. Строка, показанная в q. не может компилироваться. – Abel

0

Эта линия является неправильным:

<xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert /@rdf:resource"/></xsl:text> 

Когда вы получите шаблон Hte вы находитесь в выбранном элементе так все, что вам нужно:

<xsl:value-of select="@rdf:resource" /> 
+0

Линия действительно ошибается. Но решение (к сожалению) тоже: внутри 'xsl: text' вы не можете иметь оператор' xsl: value-of' (или любой элемент, если на то пошло). – Abel

+0

Большое вам спасибо! –

+0

@Abel - До, слишком рано, и мой xslt ржавый. Теперь исправлено. – Murph

1

Это не уверен, является ли XSLT вы показываете это действительно XSLT, который вы используете. То, как вы публикуете его, не может компилироваться. Ли линия xsl:apply-templates на том же уровне, что и линия xsl:template? Действительно ли xsl:text содержит xsl:value-of? Если это так, мне было бы очень интересно узнать, какой процессор вы используете, потому что никакой процессор не должен обрабатывать ваш XSLT, не сообщая вам об ошибках.

Сказанное, чтобы улучшить вашу таблицу стилей, сделайте как Russel Leggett explains в его ответе. Вместо того, чтобы выбирать все узлы внутри вашего шаблона (вы начинаете с /, выбирая из корня), выберите относительно текущего узла. Принимая свой ответ и удаление свою ошибку xsl:text, вы получите это:

<xsl:template match="j.0:property"> 
    <xsl:value-of select="@rdf:resource"/> 
</xsl:template> 

Использование XSLT 1.0, если выбрать несколько узлов с xsl:value-of он будет выводить только первый. Поскольку у вас, кажется, есть xsl:apply-templates где-то, что, видимо, работает, эта строка, которая выбирает все, но возвращает только первый (тот, который находится в вашем коде, начиная с /), будет вызываться три раза для каждого узла, выбранного в вашем xsl:apply-templates.

Чтобы помочь вам и лучше, пожалуйста, покажите минимальный пример полной таблицы стилей XSLT, которую мы можем выполнить против ваших данных образца.

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

  • Нет связанных вопросов^_^