2016-08-24 3 views
0

Вот отрывок из XSL документа (внутри шаблона технически):Как преобразовать XML атрибуты HTML-таблицы

<table> 
    <tr> 
    <th>INSTANCE</th> 
    <th>SWVER</th> 
    <th>SYSTEMID</th> 
    <th>SYSTIME</th> 
    <th>SYSMEM</th> 
    <th>CUTMEM</th> 
    <th>FILEMEM</th> 
    <th>CALCONFIG</th> 
    </tr> 
    <tr> 
    <td><xsl:value-of select='@INSTANCE'/></td> 
    <td><xsl:value-of select='@SWVER'/></td> 
    <td><xsl:value-of select='@SYSTEMID'/></td> 
    <td><xsl:value-of select='@SYSTIME'/></td> 
    <td><xsl:value-of select='@SYSMEM'/></td> 
    <td><xsl:value-of select='@CUTMEM'/></td> 
    <td><xsl:value-of select='@FILEMEM'/></td> 
    <td><xsl:value-of select="@CALCONFIG"/></td> 
    </tr> 
</table> 

Есть ли способ, что я могу избежать избыточности выписывая атрибуты и как заголовки таблиц и как выбор атрибута? Я не могу использовать внешние источники.

Я думал, что могу определить некоторую переменную xsl, содержащую базовую структуру, следующим образом и сгенерирую таблицу оттуда.

<list> 
    <item>INSTANCE</item> 
    ... 
    <item>CALCONFIG</item> 
</list> 

Данные XML - это всего лишь куча меток того же значения, которые содержат по крайней мере перечисленные выше атрибуты. Каждый тег выглядит примерно так:

<THING INSTANCE="boop" SWVER="foo" SYSTEMID="123" 
... 
CALCONFIG="cal.cfg" SOMETHINGELSE="bar" 
/> 
+0

Вам необходимо показать входной XML и полную таблицу стилей. –

+0

Готово. Есть идеи? – Bryant

+0

ИМХО, альтернатива закончится более подробным и менее читаемым, чем то, что у вас есть - exp. если вы используете XSLT 1.0. –

ответ

2

Чтобы проиллюстрировать этот момент я сделал в комментарии к вашему вопросу, рассмотрим следующий пример:

XML

<root> 
    <item color="red" name="alpha" size="small" garbage="123" id="1"/> 
    <item color="green" name="bravo" size="medium" garbage="456" id="2"/> 
    <item color="blue" name="charlie" size="large" garbage="789" id="3"/> 
</root> 

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="http://www.example.com/my" 
exclude-result-prefixes="my"> 
<xsl:output method="html" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<my:columns> 
    <col>id</col> 
    <col>name</col> 
    <col>size</col> 
    <col>color</col> 
</my:columns> 
<xsl:variable name="columns" select="document('')/xsl:stylesheet/my:columns" /> 

<xsl:template match="/root"> 
    <table border="1"> 
     <tr> 
      <xsl:for-each select="$columns/col"> 
       <th> 
        <xsl:value-of select="." /> 
       </th> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="item"> 
      <xsl:variable name="attributes" select="@*" /> 
      <tr> 
       <xsl:for-each select="$columns/col"> 
        <td> 
         <xsl:value-of select="$attributes[name()=current()]" /> 
        </td> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

Результат (оказано)

enter image description here

+0

Спасибо, Майкл, это то, что я искал, хотя это менее читаемо, вероятно, это поможет мне немного времени. – Bryant

+0

Один вопрос, что делает эта линия? 'exclude-result-prefixes =" my "' Мне также интересно узнать, почему пространство имен делает эту работу. У вас есть все, что вы могли бы мне указать, или просто объяснить здесь? – Bryant

+2

Это предотвращает появление в представлении объявления пространства имен 'xmlns: my =" http://www.example.com/my "'. Любой современный браузер в любом случае проигнорировал бы его, так что это всего лишь хорошая практика. - Пространство имен требуется, поскольку без него 'columns' будет интерпретироваться как [литеральный результирующий элемент] (https://www.w3.org/TR/xslt/#literal-result-element) и вызывать ошибку, поскольку элемент литерала не может быть вне шаблона. –

-1

Bryant, вам нужно работать с двумя файлами (XML и XSL):

Во-первых, необходимо указать шаблон (example.xsl):

<?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> 
    <h2>My Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
     <th>instance</th> 
     <th>swver</th> 
     <th>systemid</th> 
     <th>systime</th> 
     <th>sysmem</th> 
     <th>cutmem</th> 
     <th>filemem</th> 
     <th>calconfig</th> 
    </tr> 
    <xsl:for-each select="catalog/cd"> 
    <tr> 
     <td><xsl:value-of select="instance"/></td> 
     <td><xsl:value-of select="swver"/></td> 
     <td><xsl:value-of select="systemid"/></td> 
     <td><xsl:value-of select="systime"/></td> 
     <td><xsl:value-of select="sysmem"/></td> 
     <td><xsl:value-of select="cutmem"/></td> 
     <td><xsl:value-of select="filemem"/></td> 
     <td><xsl:value-of select="calconfig"/></td> 
    </tr> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

И тогда вам необходимо определить файл XML (example.xml), основанный на шаблоне (example.xsl):

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="example.xsl"?> 
<catalog> 
    <cd> 
    <instance>instance1</instance> 
    <swver>swver1</swver> 
    <systemid>systemid1</systemid> 
    <sysmem>sysmem1</sysmem> 
    <systime>systime1</systime> 
    <cutmem>cutmem1</cutmem> 
    <filemem>filemem1</filemem> 
    <calconfig>calconfig1</calconfig> 

    </cd> 
    <cd> 
    <instance>instance2</instance> 
    <swver>swver2</swver> 
    <systemid>systemid2</systemid> 
    <sysmem>sysmem2</sysmem> 
    <systime>systime2</systime> 
    <cutmem>cutmem2</cutmem> 
    <filemem>filemem2</filemem> 
    <calconfig>calconfig2</calconfig> 

    </cd> 
. 
. 
</catalog> 

Результата:

enter image description here

Ссылка: http://www.w3schools.com/xsl/xsl_transformation.asp

Надеется, что это помогает!

+1

Вы не ответили на вопрос, просто вернули то, что ОП уже сказал, что он сделал. Пожалуйста, перечитайте вопрос внимательно. –

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