2013-05-31 23 views
4

我已经按照MSDN文档逐字here无济于事。XSLT xsl:normalize-space()函数不起作用

我的XML的一个例子:

<Ticket xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LogNo>454564</LogNo> 
    <CaseNumber> 
     <Part1>FGV</Part1> 
     <Part2>9999</Part2> 
     <Part3>88888888  </Part3> 
    </CaseNumber> 
</Ticket> 

我的XSLT的一个例子:

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

<xsl:strip-space elements="*" /> 

<xsl:template match="/text"> 
    <xsl:value-of select='normalize-space()'/> 
</xsl:template> 

<xsl:template match="Ticket"> 
    <Ticket><xsl:attribute name="LogNumber"><xsl:value-of select="LogNo"/></xsl:attribute> 
    <CaseNumber><xsl:value-of select="CaseNumber/Part1"/>-<xsl:value-of select="CaseNumber/Part2"/>-<xsl:value-of select="CaseNumber/Part3"/></CaseNumber> 
    </Ticket> 
</xsl:template> 

</xsl:stylesheet> 

我的输出XML:

<?xml version="1.0" encoding="IBM437"?> 
<Tickets> 
    <Ticket LogNumber="454564"> 
    <CaseNumber>FGV-9999-88888888  </CaseNumber> 
    </Ticket> 
</Tickets> 

我使用

<xsl:template match="/text"> 
    <xsl:value-of select='normalize-space()'/> 
</xsl:template> 

作为MSDN文章和网上的其他人说,但似乎无法从CaseNumber Part3中删除尾随的空白。有什么我做错了吗?要做到这一点

+0

你没有'/ text'在您输入的XML。难道你的意思是'文字()'? – Tomalak

+0

我尝试过使用// text(),text()和text() –

回答

4

变化<xsl:template match="/text">
到:xsl:template match="text()">

而且使用xsl:apply-templates,而不是xsl:value-of
为此尝试:

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

    <xsl:strip-space elements="*" /> 

    <xsl:template match="text()"> 
     <xsl:value-of select='normalize-space()'/> 
    </xsl:template> 

    <xsl:template match="Ticket"> 
     <Ticket> 
      <xsl:attribute name="LogNumber"> 
       <xsl:value-of select="LogNo"/> 
      </xsl:attribute> 
      <CaseNumber> 
       <xsl:apply-templates select="CaseNumber/Part1"/>-<xsl:apply-templates select="CaseNumber/Part2"/>-<xsl:apply-templates select="CaseNumber/Part3"/> 
      </CaseNumber> 
     </Ticket> 
    </xsl:template> 

</xsl:stylesheet> 

这将产生以下输出:

<Ticket LogNumber="454564"><CaseNumber>FGV-9999-88888888</CaseNumber></Ticket> 
+0

是的!谢谢! –

6

一种方法是直接在<xsl:value-of>使用normalize-space

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

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

    <xsl:template match="Ticket"> 
    <Ticket LogNumber="{LogNo}"> 
     <xsl:apply-templates select="CaseNumber" /> 
    </Ticket> 
    </xsl:template> 

    <xsl:template match="CaseNumber"> 
    <xsl:copy> 
     <xsl:value-of select="concat(
     normalize-space(Part1), '-', 
     normalize-space(Part2), '-', 
     normalize-space(Part3) 
    )" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

+1为了显示另一种做事情的方式......这可以使事情更具可读性。 –

+0

是的 - 最突出的是注意属性值模板('LogNumber =“{LogNo}”'),它将替换您的 Tomalak

0

正常化XML的文档的Y副本可以实现一个模板:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
     xmlns:ns1="http://logiasoftware.fi/2010/CanonicalDataModel" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" indent="yes"/> 
    <xsl:template name="NormalizeSpace"> 
     <xsl:element name="{name()}"> 
      <xsl:choose> 
       <xsl:when test="*"> 
        <xsl:for-each select="*"> 
         <xsl:call-template name="NormalizeSpace"/> 
        </xsl:for-each> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="normalize-space()"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:for-each select="*"> 
      <xsl:call-template name="NormalizeSpace"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
0

我认为正常化-space不工作,因为我仍然在长字符串中换行。原来我的问题是用我的xsl:输出配置。我的配置是:

<xsl:output encoding="UTF-8" method="html" omit-xml-declaration="yes"/> 

我需要改变的输出方式:

<xsl:output encoding="UTF-8" method="text" omit-xml-declaration="yes"/>