XSLT, почему появляется в моих hrefs? - PullRequest
6 голосов
/ 19 октября 2010

У меня есть следующий XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="html" omit-xml-declaration="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="@* | node()">
        <xsl:copy>

          <html>
            <body>
            <xsl:for-each select="AdvReqIMailMsg">

              <a><xsl:attribute name="href">
                  http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute >
                Login to View History of This Request
              </a>
              <br/>
            </xsl:for-each>
            </body>
          </html>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Результат имеет следующее:

<a href="&#xA;                  http://dotnet.dynacal.com/customerlogin.asp?P=DEMO8">
                Login to View History of This Request
              </a>

Почему &#xA; и все пробелы там?Я новичок в XSLT, и мои поиски в Google не обнаружили ничего, что я понял.Спасибо, Шон

Ответы [ 5 ]

6 голосов
/ 19 октября 2010

Просто используйте :

<a href="http://{BackSideUrl}/customerlogin.asp?P={DynaCalPath}">
           Login to View History of This Request
</a>

Это (использование AVT - атрибут-значение-шаблоны) и короче, и более читабельно.

Причина описанного поведения , как объясняется почти во всех ответах, заключается в том, что значение атрибута href построено (частично) из текстового узла, содержащего символ NL.

Такие проблемы являются результатом чисто человеческого, психологического феномена : мы ясно видим NL, когда он окружен непустым пространством, однако мы NL-слепы, когда NL находится в начале или в концеблок текста.В любой среде XSLT / XML было бы полезно показывать по запросу группы специальных «невидимых» символов, таких как NL и CR.

6 голосов
/ 19 октября 2010

&#A; - закодированный символ новой строки.

Он и пробелы сохраняются от новой строки и пробелов в вашем XSLT.

2 голосов
/ 19 октября 2010

Пробелы сохраняются при смешивании узлов текста и элементов.Таким образом, одно из решений состоит в том, чтобы избежать пробела для начала (как показано Бартом) или сделать следующее, что может быть более читабельным, поскольку оно хорошо отформатировано:

<xsl:attribute name="href">
    <xsl:text>http://</xsl:text>
    <xsl:value-of select="BackSideUrl"/>
    <xsl:text>/customerlogin.asp?P=</xsl:text>
    <xsl:value-of select="DynaCalPath"/>
</xsl:attribute >
1 голос
/ 19 октября 2010

Количество пробелов в выходных данных точно соответствует количеству пробелов перед http... в вашем xslt.Удалите те и новую строку, и все будет в порядке.

1 голос
/ 19 октября 2010

Я тоже не очень знаком с XSLT, но, исходя из общего опыта программирования, попробуйте изменить

<xsl:attribute name="href">
                  http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute >

до

<xsl:attribute name="href">http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...