2016-05-20 6 views
0

Я преобразовываю XML в HTML с помощью XSLT. Моя цель - автоматизировать создание повторяющегося HTML, предоставляя ключевую информацию через XML-вход.Вызов xsl: param через вход xml

Итак, я создаю такой XML-документов для хранения строк outputed к заключительному HTML:

<animals> 
    <animal id="dog"> 
     Our best friend 
    </animal> 
    <animal id="cat"> 
     King of the internet 
    </animal> 
    <animal id="sheep"> 
     Baaaaaah 
    </animal> 
</animals> 

И я обрабатывать эти строки через XLS: Params так:

<xsl:param name="dog" select="/animals/animal[@id='dog']"/> 
<xsl:param name="cat" select="/animals/animal[@id='cat']"/> 
<xsl:param name="sheep" select="/animals/animal[@id='sheep']"/> 

Чтобы я мог использовать эти строки, добавляя этот вид фрагмента к моей таблице стилей:

<ul> 
    <li><xsl:value-of select="$dog"/></li> 
    <li><xsl:value-of select="$cat"/></li> 
    <li><xsl:value-of select="$sheep"/></li> 
</ul> 

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

<input_xml> 
    <animals> 
     <cat/> 
     <dog/> 
    </animals> 
</input_xml> 

выхода будет

<ul> 
    <li>King of the internet</li> 
    <li>Our best friend</li> 
</ul> 

Я пытаюсь автоматизировать процесс создания такого списка, обернув через тег:

<ul> 
    <xsl:for-each select="/input_xml/animals"> 
     <li><xsl:value-of select="${tag name}"/></li> 
    </xsl:for-each> 
</ul> 

но я не знаю, как захватить входное имя тега xml в select="${tag name}". Я попытался с помощью <xsl:value-of select="name()"/>, но вы не можете вкладывать xsl:value-of

+1

У вас есть два входных документов? Используете ли вы XSLT 1.0 или 2.0? –

+0

Я использую XSLT 2.0. У меня есть предопределенные xml-файлы для хранения повторяющейся информации (животных) и ссылаются на них с помощью '', чтобы я мог захватить эту информацию с помощью ''. Не повторяющаяся информация предоставляется входным XML-файлом. Все это работает очень похоже на решение, предложенное @ zx485 –

+0

@GabrielWarken: Я рад, что я, возможно, приблизил ваш желаемый ответ довольно близко. Но как выглядит ваш желаемый ответ? Будет полезно изменить ваш вопрос. – zx485

ответ

0

Вы не можете обрабатывать получившиеся строки с

<ul> 
    <li><xsl:value-of select="$dog"/></li> 
    <li><xsl:value-of select="$cat"/></li> 
    <li><xsl:value-of select="$sheep"/></li> 
</ul> 

, потому что это всегда будет создать пустой <li> тег, если какая-то переменная не будет присутствовать.

Лучшим решением будет использовать первый файл XML, назовем его animals.xml ...

<animals> 
    <animal id="dog"> 
     Our best friend 
    </animal> 
    <animal id="cat"> 
     King of the internet 
    </animal> 
    <animal id="sheep"> 
     Baaaaaah 
    </animal> 
</animals> 

... и ваш второй файл XML, назовем его input.xml ...

<input_xml> 
    <animals> 
     <cat/> 
     <dog/> 
    </animals> 
</input_xml> 

чтобы объединить их со следующим XSLT, который создает переменную, относящуюся к первому документу XML:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:variable name="doc2" select="document('animals.xml')" /> 

    <xsl:template match="/input_xml"> 
    <ul> 
     <xsl:for-each select="animals/*[name() = $doc2/animals/animal/@id]"> 
     <xsl:variable name="animalName" select="name()" /> 
     <li><xsl:value-of select="$doc2/animals/animal[@id=$animalName]"/></li> 
     </xsl:for-each> 
    </ul> 
    </xsl:template> 

</xsl:stylesheet> 

В результате этой комбинации/трансформации

<ul> 
    <li> 
     King of the internet 
    </li> 
    <li> 
     Our best friend 
    </li>  
</ul> 

Это решение сочетает в себе оба входных файлов в один выходной файл. input.xml может быть выбран в параметрах XSLT-процессора.

+0

Так как я не могу создать цикл '', подобный тому, который работает в исходном вопросе, это именно то, что я делал. Я хотел использовать цикл в этой ситуации, чтобы избежать создания небольшого шаблона для каждого отдельного параметра, так как окончательная таблица стилей будет иметь значение для животных в целом. –

+0

@GabrielWarken: Я изменил свой ответ. Я надеюсь, что это будет соответствовать вашим потребностям более соответствующим образом. Это так же просто, как и получается. – zx485

+0

Это работает отлично. Большое вам спасибо за помощь. –

0

Как использовать XSLT 2.0, вы можете определить ключ

<xsl:key name="id" match="animals/animal" use="@id"/> 

, а затем использовать

<ul> 
    <xsl:for-each select="/input_xml/animals/*"> 
     <li><xsl:value-of select="key('id', name(), $animals)"/></li> 
    </xsl:for-each> 
</ul> 
Смежные вопросы