2012-09-12 1 views
2

У меня есть XML-файл с более чем несколькими записями и разными значениями (например, список элементов со значениями, такими как их имя, номер, вес и т. Д.). Я использую XSLT, чтобы показать их в виде таблицы на веб-странице. На каждой отдельной странице отображается другая запись - xslt принимает значение параметра с веб-страницы, а затем отображает только соответствующие фрагменты информации. Например, есть веб-страница, касающаяся элемента XYZ - отображается только имя, номер и вес этого конкретного элемента.XML и XSLT - значение параметра не в XML

Мой вопрос в том, есть ли способ показать какое-то сообщение (например, «Нет данных для этого элемента»), когда в XML нет такого элемента. Это не похоже на то, что параметр пуст или нуль - он все еще берется с веб-страницы. Просто в записи XML нет такой записи.

Любая помощь, пожалуйста?

Вы можете найти код для файлов XML и XLS ниже. Я изменил имена и значения параметров/переменных, но все остальное остается таким же, как в моем исходном файле.

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ItemsTable> 
<ItemRow> 
    <item>001</item> 
    <name>aaaa</name> 
    <price>2402</price> 
    <price2>2200</price2> 
</ItemRow> 
<ItemRow> 
    <item>002</item> 
    <name>bbbb</name> 
    <price>2402</price> 
    <price2>2700</price2> 
</ItemRow> 
<ItemRow> 
    <item>003</item> 
    <name>cccc</name> 
    <price>2402</price> 
    <price2>2003</price2> 
</ItemRow> 
<ItemRow> 
    <item>004</item> 
    <name>dddd</name> 
    <price>2402</price> 
    <price2>2024</price2> 
</ItemRow> 

XSL:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:param name="thisitem">XXXX</xsl:param> 
<xsl:template match="/"> 
<xsl:apply-templates /> 
</xsl:template> 
<xsl:decimal-format name="european" decimal-separator="," grouping-separator="." /> 
<xsl:template match="/ItemsTable/ItemRow" /> 
<xsl:template match="/ItemsTable/ItemRow [ item = $thisitem ]"> 
<style>table.YYY { border-collapse: collapse; } table.YYY td, table.YYY th { border: 1px solid black; padding: 1em; vertical-align: middle; text-align: center; } table.YYY th { background-color: #eee; } table.YYY .header { font-size: 2em; font-weight: bold; padding-bottom: 1em; padding-top: 1em; } table.YYY .itemname { color: red; font-weight: bold; white-space: nowrap; } table.YYY .yellow { background-color: yellow; } table.YYY .red { background-color: red; } table.YYY .green { background-color: #40FF00; }</style> 
<html> 
<body> 
<table class="YYY"> 
<xsl:if test="string-length(name) > 0 and string-length(price) > 0 and string-length(price2) > 0" /> 
<xsl:choose> 
<xsl:when test="string-length(name) > 0 and string-length(price) > 0 and string-length(price2) > 0"> 
<tr> 
<th>Name</th> 
<th>Price 1</th> 
<th>Price 2</th> 
</tr> 
<tr> 
<xsl:choose> 
<xsl:when test="price > price2"> 
<td class="red"> 
<xsl:value-of select="name" /> 
</td> 
<td class="red"> 
<xsl:value-of select="format-number(price, '###.###.###', 'european')" /> 
</td> 
<td class="red"> 
<xsl:value-of select="format-number(price2, '###.###.###', 'european')" /> 
</td> 
</xsl:when> 
<xsl:otherwise> 
<td class="green"> 
    <xsl:value-of select="name" /> 
</td> 
<td class="green"> 
    <xsl:value-of select="format-number(price, '###.###.###', 'european')" /> 
</td> 
<td class="green"> 
    <xsl:value-of select="format-number(price2, '###.###.###', 'european')" /> 
</td> 
</xsl:otherwise> 
</xsl:choose> 
</tr> 
</xsl:when> 
<xsl:otherwise> 
<div> 
    <p>No data for this item</p> 
</div> 
</xsl:otherwise> 
</xsl:choose> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 
+2

Можете ли вы показать XSLT у вас есть до сих пор и пример вида XML у вас есть вход? –

+0

Несомненно. Я изменил имена и значения параметров/переменных, но как XML, так и XSL построены точно так же, как и ниже. – Marta

+0

Нет ничего «ниже» –

ответ

0

Помимо того, что

<xsl:template match="/ItemsTable/ItemRow [ item = $thisitem ]"> 

не является легальным в XSLT 1.0 (вы не можете использовать переменные в выражениях соответствия для каждой спецификации, но некоторые процессоры принимают их в любом случае), ваша проблема в том, что шаблоны только срабатывают, когда элементы, которые они соответствуют, существуют. Если нет ItemRow, у которого item ребенок - тот, о котором вы просите, тогда шаблон не будет срабатывать вообще.

Вместо этого вам нужно, чтобы переместить «нет данных для этого элемента логики» вверх в шаблон для родителя ItemsTable

<xsl:template match="/ItemsTable"> 
    <xsl:variable name="matchingRows" select="ItemRow[item = $thisitem][string-length(name)][string-length(price)][string-length(price2)]"/> 
    <xsl:choose> 
    <xsl:when test="$matchingRows"> 
     <xsl:apply-templates select="$matchingRows"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <div> 
     <p>No data for this item</p> 
     </div> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="ItemRow"> 
    <!-- logic for each matching row here, don't need to check the 
     preconditions as the template is only called for rows that match --> 
</xsl:template> 
+0

Спасибо! Работает как шарм :) – Marta