2015-07-13 4 views
-1

Я пытаюсь создать XML-файл с помощью XSLT. У меня есть сценарий оболочки BASH, который использует команду WGET для загрузки копии файла XML из VLC Media Player каждые 5 секунд. Ниже приведен пример раздела XML-файла, который содержит информацию, которую я хотел бы создать с помощью XSLT. Обратите внимание, что в примере XML есть множество тегов, которые начинаются с < info name = 'уникальный' > и заканчивается </info >. Например, первый тег: < info name = 'date'/info > и третий тег: < info name = 'filename' > Что-то в пути </info >.Форматирование тегов XML для XSLT

<category name="meta"> 
<info name='date'>1991</info> 
<info name='artwork_url'>file://D:/Music/Nirvana/Nevermind/Folder.jpg</info> 
<info name='filename'>Something in the Way</info> </category> 


Я использую этот код в заголовке файла XML для стилизации XML.

<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?> 


Когда я воспитываю .xml файл в браузере, это стилизовано с помощью XSLT. Однако отображается только первый тег <info>. В этом примере будет отображаться только < info name = 'date'/info >. Моя общая цель - отобразить только имя и имя песни в браузере.

Я на самом деле есть то, что я думаю, что это очень необычное решение, которое было бы использовать команду SED или AWK в Linux в сочетании с некоторыми типами опции auto_increment, чтобы найти и заменить текстовую информацию так, чтобы XML преобразуется во что-то вроде ниже. Затем я смогу настроить XSLT для чтения info1, info2, info3 и т. Д.

<info1>data</info1> 
<info2>data</info2> 
<info3>data</info3> 


Это трудно сделать этот необычный обходной путь, потому что VLC выходы динамических Ставки тегов, поэтому один XML-файл может иметь < информация имя = «дата» > тег, и следующий файл XML может не содержать тег < info = 'date' >, поэтому я не могу использовать команду AWK, которая ожидает, что $ 27 всегда будет < info name = 'date' >. Это также похоже на то, что это не может быть рекомендованным решением этой проблемы и, вероятно, является изменчивым методом, поэтому я размещаю здесь вопрос для обратной связи.

Я также провел некоторое исследование пространства имен XML, но я не был уверен, стоит ли мне сосредоточиться на пространстве имен здесь. Любое понимание, советы или рекомендации были бы очень оценены.

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
<body> 
<h2>My CD Collection</h2> 
<table border="1"> 
<tr bgcolor="#9acd32"> 
<th>Title</th> 
</tr> 
<xsl:for-each select="category"> 
<tr> 
<td><xsl:value-of select="info"/></td> 
</tr> 
</xsl:for-each> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 
+0

Вы можете использовать любое имя атрибута, который вы хотите в вашем 'выберите = "данные"' строки. – usr2564301

+0

Благодарим вас за рекомендацию @Jongware! Предположим, что у моего XML есть 1991 и Nirvana . В моей таблице стилей XSLT отобразит 1991 в браузере. Я пробовал другие варианты. Если я попробую , браузер не отображает никаких данных. Если я попробую , браузер выдает ошибку xpath. – JeremyCanfield

ответ

1

В XSLT 1.0, xsl:value-of получает значение первого узла выбранного набора узлов. Если вы хотите, чтобы получить все из них, использовать что-то вроде:

<xsl:for-each select="category"> 
    <tr> 
     <xsl:for-each select="info"> 
      <td><xsl:value-of select="."/></td> 
     </xsl:for-each> 
    </tr> 
</xsl:for-each> 

В качестве альтернативы, вы можете выбрать их по отдельности их атрибутом name, например,:

<xsl:for-each select="category"> 
    <tr> 
     <td><xsl:value-of select="info[@name='date']"/></td> 
     <td><xsl:value-of select="info[@name='filename']"/></td> 
    </tr> 
</xsl:for-each> 

или их положение:

<xsl:for-each select="category"> 
    <tr> 
     <td><xsl:value-of select="info[1]"/></td> 
     <td><xsl:value-of select="info[3]"/></td> 
    </tr> 
</xsl:for-each> 
+0

Awesome, Awesome, Awesome !!! Большое спасибо @ michael.hor257k. Я очень ценю это. – JeremyCanfield

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