2015-05-14 4 views
1

Я пытаюсь преобразовать источник XML в HTML-страницу с помощью таблицы стилей XSLT.Таблица стилей XSLT, не отображающая значения

код XML здесь:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="P_44.xsl"?> 
<JournalData> 
<PatientData><Patient><Name>Jones, John</Name> 
<CodeNumber>191212121212</CodeNumber> 
<CodeNumberType>C</CodeNumberType> 
<BirthDate>1912-12-12</BirthDate> 
<Sex>F</Sex> 
<Deceased>0</Deceased> 
<DoubleReg>0</DoubleReg> 
<InterpreterNeeded>0</InterpreterNeeded> 
</Patient> 
</PatientData> 
</JournalData> 

таблицы стилей XSLT здесь:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
<body> 
<h1>Journal</h1> 
<table border="1"> 
<tr bgcolor="#9acd32"> 
<th>Element name</th> 
<th>Contence</th> 
</tr> 
<tr bgcolor="#FBF5A4"> 
<th>Patient</th> 
</tr> 
<xsl:for-each select="JournalData/PatientData/Patient/Name"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="Name" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/CodeNumber"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="CodeNumber" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/CodeNumberType"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="CodeNumberType" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/BirthDate"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="BirthDate" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/Sex"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="Sex" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/Deceased"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="Deceased" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/DoubleReg"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="DoubleReg" /></td> 
</tr> 
</xsl:for-each> 

<xsl:for-each select="JournalData/PatientData/Patient/InterpreterNeeded"> 
<tr> 
<td><xsl:value-of select="local-name()" /></td> 
<td><xsl:value-of select="InterpreterNeeded" /></td> 
</tr> 
</xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 

</xsl:stylesheet> 

Это преобразование к красивому два столбца HTML таблицы, где первый один имеет имя элемента распечатанный, но второй столбец пуст. Почему значения не отображаются? Что не так в таблице стилей?


Спасибо вам большое. Теперь я работаю. Теперь столбцы продолжаются вниз с новым заголовком на желтом фоне (так же, как «Пациент»), называемым «PatientAddress». Это один шаг вложенности:

становится

Это все прекрасно работает только для одной досадной детали. Поскольку имя элемента «PatientAdress» является дочерним по типу «Пациент», оно становится двойным. Во-первых, когда все дети (это правильная терминология?) В разделе «Пациент» печатаются, все значения под «PatientAdress» входят в одну строку, а затем снова, когда я устанавливаю

Как избавиться от первого экземпляра? Глядя, как это:

PatientAddress Bondstreet 9 211 11 Мерси Суррей 12 Surrey 72

Если только выглядеть следующим образом:

<tr bgcolor="#FBF5A4"><th>PatientAddress</th></tr><tr><td>Address1</td> <td>Bondstreet 9</td></tr><tr><td>ZipCode</td><td>211 11</td></tr><tr><td>City</td><td>Mersey</td></tr><tr><td>State</td><td>Surrey</td></tr><tr><td>StateCode</td><td>12</td></tr><tr><td>District</td><td>Surrey</td></tr><tr><td>DistrictCode</td><td>72</td></tr></tbody></table></body></html> 

(Попытка вставить симпатичную таблицу, но не удается ... . :-()

+2

Из 8 вопросов, которые вы задали в течение последних трех лет, вы приняли 0 ответов. Принятие ответа помогает будущим читателям, указывая, что ответ сработал для вас. Это также увеличивает репутацию акита и ответа, отражающую их полезность с течением времени. Прочитайте, как принять и больше о принятии [** здесь **] (http://meta.stackoverflow.com/q/5234/234215), и, пожалуйста, подумайте о том, чтобы принять ответ на свой вопрос и на ваши прошлые вопросы. Спасибо. – kjhughes

ответ

0

Просто итерация один раз по каждому Patient и один раз за каждый ребенок Patient:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <h1>Journal</h1> 
     <table border="1"> 
      <tr bgcolor="#9acd32"> 
      <th>Element name</th> 
      <th>Contence</th> 
      </tr> 
      <xsl:for-each select="JournalData/PatientData/Patient"> 
      <tr bgcolor="#FBF5A4"> 
       <th>Patient</th> 
      </tr> 
      <xsl:for-each select="*"> 
       <tr> 
       <td><xsl:value-of select="local-name()"/></td> 
       <td><xsl:value-of select="." /></td> 
       </tr> 
      </xsl:for-each> 
      </xsl:for-each> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Тогда XSLT будет стиль вашего XML, как это:

enter image description here

+0

Большое вам спасибо. Теперь я работаю. Теперь столбцы продолжаются вниз с новым заголовком на желтом фоне (так же, как «Пациент»), называемым «PatientAddress». Это один шаг дальнейшего вложенности: становится

1

Внутри из for-each вам нужно просто использовать <xsl:value-of select="."/> для вывода строкового значения узла контекста. Если вы используете <xsl:value-of select="foo"/>, тогда вы ищите дочерний элемент этого имени контекстного узла.

0

Проблема в том, что внутри ваших элементов <xsl:for-each> вы уже соответствуете элементу, который вы хотите. Например:

<xsl:for-each select="JournalData/PatientData/Patient/Name"> 
    <tr> 
     <td><xsl:value-of select="local-name()" /></td> 
     <td><xsl:value-of select="Name" /></td> 
    </tr> 
</xsl:for-each> 

Здесь вы сопрягали имя уже в <xsl:for-each>, поэтому в <xsl:value-of select="Name" /> вы на самом деле пытаетесь найти значение имени ребенка Имени. И нет никого. Вы должны просто использовать <xsl:value-of select="."/>, чтобы получить значение элемента, в котором вы находитесь.

Вместо затем заменить все такие строки в шаблоне, вы можете сделать это один раз следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <h1>Journal</h1> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Element name</th> 
         <th>Contence</th> 
        </tr> 
        <tr bgcolor="#FBF5A4"> 
         <th>Patient</th> 
        </tr> 

        <xsl:apply-templates select="//Patient/*"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="Patient/*"> 
     <tr> 
      <td> 
       <xsl:value-of select="local-name()" /> 
      </td> 
      <td> 
       <xsl:value-of select="." /> 
      </td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

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

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