2016-06-14 2 views
1

Я просто пытаюсь написать код XSL 1.0 (преобразование XML с XSLT), который позволяет мне выдавать значение атрибута в зависимости от атрибута низкого уровня. Чтобы пояснить это, пример может быть полезен:Получить верхний XML-узел Значение в зависимости от атрибута

<age_list> 
    <age i="13"> 
    <type j="min"/> 
    </age> 
    <age i="22"> 
    <type j="max"/> 
    <age_list> 
</age_list> 

Итак, я хочу, чтобы извлечь атрибут в возрасте, я, но мне нужно знать, является ли это минимальное или максимальным возрастом, как, например, некоторые фильмы запрещены для детей моложе 18 лет, но рекомендуемый возраст составляет 12 лет. Таким образом, у каждого фильма есть возрастный список, но не каждый возрастной список содержит минимальный и максимальный возраст, иногда есть только макс, иногда просто мин, а иногда и то и другое. Если min не задан, он автоматически устанавливается в 0, а значение max устанавливается равным 999, если оно не задано. Итак, как я мог это достичь?

я перебирать все списки возрастных и сделать следующий тест:

<xsl:choose> 
    <xsl:when test="./age/type[@j='MIN']"> 
     <xsl:value-of select="./age/@j" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
<xsl:choose> 
    <xsl:when test="./age/type[@j='MAX']"> 
     <xsl:value-of select="./age/@j" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

Но это становится мне на максимум и минимум такое же значение, которое звучит логично, так как я отношусь к текущему возрасту, а не в зависимости от атрибута j типа.

ответ

0

XML и XSLT чувствительны к регистру. В XML ваш атрибут j имеет значение min, но в вашем XSLT вы ищете MIN, который отличается.

Кроме того, ваш код первые тесты на качестве age атрибута данного типа, но xsl:when не изменяет текущий контекст, а это значит, когда вы делаете <xsl:value-of select="./age/@j" /> вы просто получаете самый первый age элемент, а не тот, у кого из требуемый тип.

Попробуйте вместо этого:

<xsl:choose> 
    <xsl:when test="age[type/@j='min']"> 
     <xsl:value-of select="age[type/@j='min']/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
<xsl:choose> 
    <xsl:when test="age[type/@j='max']"> 
     <xsl:value-of select="age[type/@j='max']/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

Вы можете избежать повторного выражения с переменной

<xsl:variable name="min" select="age[type/@j='min']" /> 
<xsl:choose> 
    <xsl:when test="$min"> 
     <xsl:value-of select="$min/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

<xsl:variable name="max" select="age[type/@j='max']" /> 
<xsl:choose> 
    <xsl:when test="$max"> 
     <xsl:value-of select="$max/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
+0

Спасибо, сэр! Это работает свободно! Im новое для XSLT, поэтому я не знаю, как достичь определенных атрибутов и значений узла. Способ мышления так сильно отличается от программирования Java или подобного материала. – BlackACE