2013-09-22 2 views
0

Я пытаюсь преобразовать XML-документ в какой-то простой текстовый код и хотел бы иметь правильный отступ. Я не нашел никакой хорошей информации о том, как это может быть достигнуто. Я немного начал экспериментировать.Передача пробелов в шаблон с помощью параметра-param в XSLT

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

<xsl:apply-templates select="foo"> 
    <xsl:with-param name="indent"> </xsl:with-param> 
</xsl:apply-templates> 

Только одна проблема ... пробелы не передаются, если параметр содержит только пробелы! Имея что-то вроде символа, можно передать как ведущее, так и конечное пространство, но как только я пропускаю только пробелы, он изменяется на пустую строку.

<xsl:apply-templates select="foo"> 
    <xsl:with-param name="indent"> a </xsl:with-param> 
</xsl:apply-templates> 

Ожидается ли такое поведение?

Я использую xsltproc на Linux для запуска преобразования.

Дайте мне знать, какую дополнительную информацию я могу предоставить. Спасибо за любую помощь!

ответ

1

Вместо того, чтобы ваша строка была текстовым узлом с элементом <xsl:with-param>, передайте ее как атрибут select.

Например, следующие таблицы стилей XSLT:

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

    <xsl:template match="/"> 

    <!-- With whitespace only. --> 
    <xsl:apply-templates select="foo"> 
     <xsl:with-param name="indent" select=" ' ' "/> 
    </xsl:apply-templates> 

    <!-- Carriage return. -->  
    <xsl:text>&#xd;</xsl:text> 

    <!-- With leading and trailing whitespace. --> 
    <xsl:apply-templates select="foo"> 
     <xsl:with-param name="indent" select=" ' b ' "/> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="foo"> 
    <xsl:param name="indent"/> 

    <xsl:text>$</xsl:text> 
    <xsl:value-of select="$indent"/> 
    <xsl:text>$</xsl:text>  
    </xsl:template> 

</xsl:stylesheet> 

применительно к этому входному XML:

<foo> 
    Bar 
</foo> 

производит следующий вывод:

$ $ 
$ b $ 
+0

БлАгоДАрит славный пример! – murrekatt

2

Я бы просто использовать <xsl:with-param name="indent" select="' '"/> ,

Если вы хотите, чтобы передать значение внутри xsl:with-param, то вам нужно использовать

<xsl:with-param name="indent"> 
    <xsl:text> </xsl:text> 
</xsl:with-param> 

или

<xsl:with-param name="indent" xml:space="preserve"> </xsl:with-param> 
+0

Спасибо, Мартин! Использование xsl: text работает, но второе предложение с xml: space не имеет никакого значения. Непонятно, почему нет. – murrekatt

+0

Как передать значение '$ indent', а также еще два пробела внутри атрибута' select'? – murrekatt

+0

Нашел сам: 'concat ('', $ indent)' – murrekatt

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