2013-05-23 2 views
1

У меня есть кусок XML, который выглядит как:Как понять линейные разрывы в XSLT?

<bunch of other things> 
<bunch of other things> 
<errorLog> error1 \n error2 \n error3 </errorLog> 

Я хочу изменить XSLT, что этот XML проходит через применение новой строки после errors1 через error3.

Я могу полностью контролировать вывод errorLog или содержимого XSLT-файла, но я не уверен, как обрабатывать XML или XSLT, чтобы сделать вывод HTML-строки разрыва строки. Легче ли изменить вывод XML на какой-то специальный символ, который вызовет новую строку, или я могу изменить XSLT для интерпретации \n как новых строк?

Существует example on this site, который содержит что-то похожее на то, что я хочу, но мой <errorLog> XSLT вложен в другой шаблон, и я не уверен, как шаблоны внутри шаблонов могут работать.

+1

Шаблоны не гнездятся. Покажите, как выглядит ваш xsl в настоящее время. –

ответ

2

Если у вас есть контроль над вашим элементом errorLog, вы можете использовать буквенный символ LF. Он ничем не отличается от любого другого персонажа, что касается XSLT.

Что касается создания HTML-кода, который отображается с разрывами строк, вам нужно добавить элемент <br/> вместо любого маркера, который у вас есть в вашем источнике XML. Это было бы легче всего, если вы могли бы поставить каждую ошибку в виде отдельного элемента, как этот

<errorLog> 
    <error>error1</error> 
    <error>error2</error> 
    <error>error3</error> 
</errorLog> 

то XSLT не придется пройти через довольно неуклюжий процесс расщепления до самого текста.

С этим XML-данными, взятыми из вашего вопроса

<document> 
    <bunch-of-other-things/> 
    <bunch-of-other-things/> 
    <errorLog>error1 \n error2 \n error3</errorLog> 
</document> 

таблицы стилей

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="/document"> 
    <html> 
     <head> 
     <title>Error Log</title> 
     </head> 
     <body> 
     <xsl:apply-templates select="*"/> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="errorLog"> 
    <p> 
     <xsl:call-template name="split-on-newline"> 
     <xsl:with-param name="string" select="."/> 
     </xsl:call-template> 
    </p> 
    </xsl:template> 

    <xsl:template name="split-on-newline"> 
    <xsl:param name="string"/> 
    <xsl:choose> 
     <xsl:when test="contains($string, '\n')"> 
     <xsl:value-of select="substring-before($string, '\n')"/> 
     <br/> 
     <xsl:call-template name="split-on-newline"> 
      <xsl:with-param name="string" select="substring-after($string, '\n')"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$string"/> 
     <br/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

будет производить этот выход

<html> 
    <head> 
     <title>Error Log</title> 
    </head> 
    <body> 
     <bunch-of-other-things/> 
     <bunch-of-other-things/> 
     <p>error1 <br/> error2 <br/> error3<br/> 
     </p> 
    </body> 
</html> 
+0

Это тонна смысла. Я могу сделать каждую ошибку внутри своего собственного элемента ошибки, как в вашем первом примере. Как только это будет сделано, как изменить xsl для создания строк новой строки между каждым элементом ошибки? – pizzathehut

3

Backslash используется в качестве экранирующего символа в ряде языки, включая C и Java, но не в XML или XSLT. Если вы поместите \ n в таблицу стилей, это не символ новой строки, это два символа обратной косой черты, а затем «n». XML-способ записи новой строки - &#xa;. Однако, если вы отправляете новую строку в браузер в HTML, она отображает ее как пробел. Если вам нужна новая строка, отображаемая браузером, вам необходимо отправить элемент <br/>.