2011-06-13 200 views
2

如何刪除在打破鏈接的「Location」元素後添加的空格? IE: 「/位置toxxx.aspx」 XML刪除xsl中的空白

- <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> 

很抱歉,如果我沒有貼碼正確,如果我留在換行符它刪除部分。

+0

好問題,+1。查看我對三種不同XSLT 1的回答。0解決方案和第四個僅在XSLT 2.0中可用的解決方案。我建議在可能的情況下始終使用AVT。 – 2011-06-14 02:17:41

+0

不好的問題-1!您發佈的代碼不會添加您抱怨的空白。我得到的印象是你的真實代碼是不同的,並且在「toHeathrow」字符串旁邊有空白 - 但你已經讓我猜測了。 – 2011-06-14 07:55:24

+0

@Michael Kay:我認爲@matt在編寫代碼時遇到困難。當我讀到這個問題時,在「toHeathrow.aspx」之後有一個回車符和空格 - 可能是我自己的IDE重新格式化的結果。 – 2011-06-14 12:50:19

回答

4

有這樣做的至少三種不同的方式:

  1. 使用AVT(Attribute-Value Templates) - 推薦

    <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可以在<xsl:attribute>指令使用select屬性:

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

我建議使用AVTS一直當這是可能的 - 從而使代碼更短,更簡單,更容易理解。

+0

這完美的作品!非常感謝。 – matt 2011-06-14 15:06:38

+0

@matt:不客氣。 – 2011-06-14 17:10:13

2

請不要在一行中發佈XML文檔。提供的XML(片段,因爲沒有根目錄)與XSL樣式表不匹配( Field具有某些屬性的空元素,但在此處肯定沒有 Location屬性,而 //Data/Row路徑)。

您提供了僅與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。它更加緊湊。

+0

感謝您的幫助。 AVT建議起作用。 – matt 2011-06-14 15:22:57