Чтение нескольких экземпляров тега или элемента с использованием XSLT - PullRequest
0 голосов
/ 08 апреля 2010

Мой xml-файл RDF выглядит примерно так ...

<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 раза.Значение, являющееся значением первого обнаруженного свойства.Пожалуйста, помогите, как я могу получить значение для каждого свойства.

Ответы [ 3 ]

4 голосов
/ 08 апреля 2010

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

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

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

1 голос
/ 08 апреля 2010

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

Тем не менее, чтобы улучшить свою таблицу стилей, сделайте, как Рассел Леггетт объясняет в своем ответе. Вместо выбора всех узлов внутри вашего шаблона (вы начинаете с /, выбирая из корня), выберите относительно текущего узла. Взяв его ответ и удалив ошибку 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, которую мы можем использовать для ваших примеров данных.

0 голосов
/ 08 апреля 2010

Эта строка неверна:

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

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

<xsl:value-of select="@rdf:resource" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...