Удалить пробел в xsl - PullRequest
       17

Удалить пробел в xsl

2 голосов
/ 14 июня 2011

Как я могу избавиться от места, которое добавляется после элемента "Location", который разрывает ссылки? IE: "/ location toxxx.aspx" XML

- <Root>
 <Schema>
 <Field Type="Text" DisplayName="Location" Required="FALSE" MaxLength="255"  Name="Location" /> 
 <Field Type="Currency" DisplayName="Price one way-saloon" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_one_x0020_way" /> 
 <Field Type="Currency" DisplayName="Price return-saloon" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_return" /> 
 <Field ReadOnly="TRUE" Type="Computed" Name="LinkTitle" DisplayName="Location id" /> 
 <Field Type="Currency" DisplayName="Price one way-estate" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_one_x0020_way_x002d_" /> 
 <Field Type="Currency" DisplayName="Price return-estate" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_return_x002d_estate" /> 
 <Field Type="Currency" DisplayName="Price one way-MPV" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_one_x0020_way_x002d_0" /> 
 <Field Type="Currency" DisplayName="Price return-MPV" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_return_x002d_MPV" /> 
 <Field Type="Currency" DisplayName="Price one way-MPV+" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_one_x0020_way_x002d_1" /> 
 <Field Type="Currency" DisplayName="Price return-MPV+" Required="FALSE" Decimals="0" LCID="2057" Name="Price_x0020_return_x002d_MPV_x00" /> 
 </Schema>
 <Data ItemCount="1">
 <Row Location="" Price_x0020_one_x0020_way="" Price_x0020_return="" LinkTitle="" Price_x0020_one_x0020_way_x002d_="" Price_x0020_return_x002d_estate="" Price_x0020_one_x0020_way_x002d_0="" Price_x0020_return_x002d_MPV="" Price_x0020_one_x0020_way_x002d_1="" Price_x0020_return_x002d_MPV_x00="" /> 
</Data>
</Root>

XSL

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" /> 
      <xsl:template match="/">
 <div id="locations">
 <ul id ="navbar" class="MSC_PrimaryNavFrame">
 <li><a href="#"><b>Going to Heathrow?<br />Find your fare fast!</b></a>
 <ul class="locations">
 <xsl:for-each select="//Data/Row">
 <li><a><xsl:attribute name ="href"><xsl:value-of  select="@Location"/>_toheathrow.aspx</xsl:attribute>
 <xsl:value-of select = "@Location" />
 </a>
 </li>
 </xsl:for-each>
 </ul>
 </li>
 </ul>
 </div></xsl:template>
 </xsl:stylesheet>

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

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Существует как минимум три способа сделать это :

  1. Использование AVT ( Шаблоны значений атрибутов ) - рекомендуется

        <li>
            <a href="{@Location}toheathrow.aspx">
                <xsl:value-of select = "@Location" />
            </a>
        </li>
    
  2. Использование стандартной функции XPath concat():

-

<a>
    <xsl:attribute name="href">
     <xsl:value-of select=
     "concat(@Location,'toheathrow.aspx')"/>
    </xsl:attribute>
    <xsl:value-of select = "@Location" />
</a>

0,3. Использование инструкции Xslt <xsl:text>:

-

<a>
    <xsl:attribute name="href">
     <xsl:value-of select="@Location"/>

     <xsl:text>toheathrow.aspx</xsl:text>
    </xsl:attribute>
    <xsl:value-of select = "@Location" />
</a>

0,4. Кроме того, в XSLT 2.0 можно использовать атрибут select в инструкции <xsl:attribute> :

<li>
    <a>
        <xsl:attribute name="href"
         select="concat(@Location, 'toheathrow.aspx')"/>
        <xsl:value-of select = "@Location" />
    </a>
</li>

Я рекомендую использовать AVT всегда, когда это возможно - что делает код короче, проще и понятнее.

2 голосов
/ 14 июня 2011

Пожалуйста, не размещайте XML-документы в одну строку.Предоставленный XML (фрагмент из-за отсутствия корня) не соответствует таблице стилей XSL (Field пустые элементы с некоторыми атрибутами, но определенно нет атрибута Location здесь и //Data/Row path).

Вы указалипросто часть XSL с xsl:for-each петлей.Я думаю, что вы ищете что-то вроде:

<xsl:for-each select="//Data/Row">
    <li>
        <a href="{@Location}toheathrow.aspx">
            <xsl:value-of select="@Location"/>
        </a>
    </li>
</xsl:for-each>

Если значение атрибута @Location содержит пробелы, то вы можете дополнительно использовать функцию normalize-space() (изXPath 1.0).Например:

normalize-space('  some scattered    value   ') = 'some scattered value'

РЕДАКТИРОВАТЬ:

Изменено {concat(@Location, 'toheathrow.aspx')} на {@Location}toheathrow.aspx.Это справедливо более компактно.

...