XSLT为什么在我的href中显示
?

7
我有以下的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的新手,我的谷歌搜索没有找到我能理解的答案。 谢谢, 肖恩


好问题,+1。请查看我的答案,这是最短和最易读的解决方案。 :) - Dimitre Novatchev
相同的原因(但并非完全重复):https://dev59.com/onRA5IYBdhLWcg3wuAcp - Lucero
5个回答

8
< p > &#A; 是一个编码的换行符。

< p > 它和空格都保留了来自XSLT中换行和空格。


6

只需使用:

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

这种使用AVT(Attribute-Value-Templates)的方法既更短,又更易读。
几乎所有答案都解释了href属性值的行为原因:该属性值的构建是由包含NL字符的文本节点(部分)完成的。
这种问题是纯粹的人类心理现象的结果:只要周围没有空格,我们就能清晰地看到NL,但当NL位于文本块的开头或结尾时,我们就会对其视而不见。任何XSLT/XML IDE都显示特殊“隐形”字符组(如NL和CR)将是一个有用的功能。

@Lucero:其他人已经解释了为什么会发生这种情况,我看没有必要重复他们的解释。 :) - Dimitre Novatchev
@LarsH:谢谢。我所说的“每个人都知道这一点”是指每个人无意识地知道这一点——否则XSLT就不会像它现在这样“工作”。 - Dimitre Novatchev
@LarsH,@Alejandro:刚刚添加了心理学解释。 - Dimitre Novatchev
@Dimitre:我猜我理解你所说的“无意识知道这一点”,通常情况下事情会按照你需要的方式进行。但很多时候,新手(包括我)会发现自己面临着一种不符合我们期望的情况(比如这里),然后我们需要有意识地了解(一些)空格规则,以便能够解决问题。 - LarsH
@LarsH:我认为心理学解释了为什么这种混淆的原因在潜意识层面上--无论如何阅读,潜意识总是更强大并且总是优先考虑。嗯...不要把我看作野蛮人... :) - Dimitre Novatchev
显示剩余6条评论

2

当你混合文本节点和元素节点时,空格将被保留。因此,一种解决方法是避免使用空格(如Bart所示),或者采用下面这种方式,它可能更易于阅读,因为它会得到良好的格式化:

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

当您混合文本和元素节点时,空格将被保留。我知道您的意思,但我认为这个陈述并不准确。相反,当空格与非空格文本在同一文本节点中时,即空格和非空格文本在没有开始或结束标记的情况下在一起时,空格将被保留。后者经常发生在将文本和元素作为兄弟节点混合使用时,但不一定是这样,并且不仅限于此。 - LarsH
@LarsH,你说得对,这是一个广泛的简化。问题在于Visual Studio的格式化程序似乎忽略了这种情况,并愉快地插入了实际上很重要的换行符。因此,如果你遵循不混合文本和元素作为内容的规则(也就是说,使所有元素仅包含文本或带有可选空格的元素,但不是两者都有),格式化程序将不会破坏你的文档。这就是我写这个简化的原因 - 它应该有助于避免文档被破坏。 - Lucero

1

我自己对 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 >

1
输出中的空格数量应该与你在 XSLT 中 http... 之前的空格数量完全匹配。 去掉它们和换行符,你就没问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接