Получена следующая проблема касательно отображения нескольких строк (таблиц) XML. Они (XML данные) оформлены в виде таблицы (как будто предполагается, что она будет отображаться в виде HTML таблицы). Самый обычный показанный способ - в виде HTML таблицы.
Но теперь способ, которым я хотел отображаться (через XSLT), похож на какую-то «карточку» со сворачиванием всех столбцов в строки, где количество строк должно быть равно количеству полей плюс одинаковое количество соответствующих заголовков.
Я покажу вам пример, чтобы лучше понять мои требования (этот вопрос уже поднимался ранее, но ни один из ответов не был удовлетворительным .. по крайней мере, не для меня). Вот моя таблица данных. xml:
<persns>
<prsn>
<fname>Smith</fname>
<lname>Milton</lname>
<age>44</age>
<addrss>5th summer st, mntb</addrss>
<city>Portland</city>
</prsn>
<prsn>
<fname>Ken</fname>
<lname>Jackson</lname>
<age>37</age>
<addrss>19th Penfield ave, brtcl</addrss>
<city>Kelowna</city>
</prsn>
<prsn>
<fname>Susan</fname>
<lname>Arkland</lname>
<age>48</age>
<addrss>34th Mansfield st, sgtp</addrss>
<city>Raleigh</city>
</prsn>
<persns>
, которая приблизительно может быть представлена следующим образом:
|======|========|=====|======================|==========|
|FNAME | LNAME | AGE | ADDRESS | CITY |
|======|========|=====|======================|==========|
|Smith |Milton | 44 | 5th smmr st, mntb | Portland |
|------|--------|-----|----------------------|----------|
| Ken |Jackson | 37 |19th Pnfeld ave, brtcl| Kelowna |
|------|--------|-----|----------------------|----------|
|Susan |Arkland | 48 |34th Mansfield st,sgtp| Raleigh |
|------|--------|-----|----------------------|----------|
|Patsy |Brighton| 35 |12th Peel st, pnslv |Phldlphia |
|======|========|=====|======================|==========|
Fig.1
И через какое-то преобразование .xslt мне понадобится xml чтобы отображаться так:
|================| |================|
| FNAME | | FNAME | <--- header name
|----------------| |----------------|
| Smith | | Ken | <--- corresponding element name
|----------------| |----------------|
| LNAME | | LNAME | <--- header name
|----------------| |----------------|
| Milton | | Jackson | <--- corresponding element name
|----------------| |----------------| . . . and so on
| AGE | | AGE |
|----------------| |----------------|
| 44 | | 37 |
|----------------| |----------------|
| ADDRESS | | ADDRESS |
|----------------| |----------------|
|5th smmr st,mntb| | 9th Pnfeld ave,|
|----------------| |----------------|
| CITY | | CITY |
|----------------| |----------------|
| Portland | | Kelowna |
|================| |================|
Fig.2
Как можно заметить, это отображение сначала с заголовком, затем с узлом элемента прямо под ним, затем со следующим заголовком, и снова под ним идет соответствующий элемент узла и так далее. Следующая таблица HTML снова строится сначала с заголовком сверху, затем с этим элементом узла и так далее, и так далее. И каждый из этих блоков элементов - с соответствующими заголовками - должен быть разделен на HTML таблиц (отдельно).
Будучи новичком в .xslt, я действительно не мог придумать, как это сделать, хотя я "сделал" какой-то плохой .xslt-код, который я опишу здесь. Но не работает вообще. Это дает что-то, но не настолько, как я хочу. Итак, вот оно:
<xsl:template match="/">
<xsl:variable name="hd_tbl">
<head fname ="FNAME" lnme="LNAME" age="AGE" addrs="ADDRESS" oras="oras"/>
</xsl:variable>
<xsl:for-each select="persns/prsn | $hd_tbl/head/@*">
<table id="tbl" border="1">
<xsl:choose>
<xsl:when test="(position() mod 2) != 1"> <!-- even line -->
<tr> <th> <xsl:value-of select="./@*"/></th></tr>
</xsl:when>
<xsl:otherwise>
<tr> <td> <xsl:value-of select="."/></td></tr>
</xsl:otherwise>
</xsl:choose>
</table>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Итак, ребята, пожалуйста, помогите мне разобраться с этим, так как я боролся с этим уже довольно давно.
Большое спасибо заранее.