1

我在尝试使用when test=....

当我输出$tcbrand它时,它会输出,'Direct'但是当我对其进行操作时,它会返回false并击中 else 块。我究竟做错了什么?

    <fo:static-content flow-name="header-normal" font-size="10pt">  

                <xsl:variable name="tcbrand" select="smf:entity[@type='d2501b79-f888-4aa8-9fcf-a667a4c47c84']"/>

                <fo:block font-size="10pt" text-align="left">
                    <fo:inline font-weight="normal">Brand: <xsl:value-of select="$tcbrand"/></fo:inline>
                </fo:block>

                <xsl:choose>
                    <!--<xsl:if test="$image = 'hello' ">-->
                    <xsl:when test="string($tcbrand)='Direct'">
                        <fo:block text-align="right" space-before="0mm">
                            <fo:external-graphic src="url('C:\Program Files (x86)\numerointeractive\whitemail\Images\18-30.png')" />
                        </fo:block>             
                    </xsl:when>

                    <xsl:otherwise>                         
                            <fo:block text-align="right" space-before="0mm">
                                <fo:external-graphic src="url('C:\Program Files (x86)\numerointeractive\whitemail\Images\ecom2.jpg')" />
                            </fo:block>             
                    </xsl:otherwise>                                
                </xsl:choose>

这是生成的 xml,我正在对其进行操作:

 <smf:entity id="48659" type="d2501b79-f888-4aa8-9fcf-a667a4c47c84" confidence="1.0" author="2e0b99b3-9cba-4736-a59b-fe00b5f62871" validated="true" preferred="false" requiresComponentExtraction="false" changeTime="2012-11-26T14:47:28.840Z" nonPersistedId="false" modified="false">
           <smf:value>Direct</smf:value>
        </smf:entity>
4

2 回答 2

4
<xsl:variable name="tcbrand" select="smf:entity[@type='d2501b79-f888-4aa8-9fcf-a667a4c47c84']"/>

tcbrand变量设置为smf:entity元素。元素的字符串值是其所有后代文本节点的串联,对于

<smf:entity id="48659" type="d2501b79-f888-4aa8-9fcf-a667a4c47c84" confidence="1.0" author="2e0b99b3-9cba-4736-a59b-fe00b5f62871" validated="true" preferred="false" requiresComponentExtraction="false" changeTime="2012-11-26T14:47:28.840Z" nonPersistedId="false" modified="false">
       <smf:value>Direct</smf:value>
    </smf:entity>

表示一个换行符、七个空格、“直接”、另一个换行符和另外四个空格。这不等于“直接”。我可以想到三个可能的解决方法:你可以使用

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

在样式表的顶部,这将导致它完全忽略输入文档中的所有仅空白文本节点,您可以normalize-space在进行测试时:

<xsl:when test="normalize-space($tcbrand)='Direct'">

或者您可以在变量声明点获取子<smf:value>元素的值而不是父元素的值<smf:entity>

<xsl:variable name="tcbrand"
  select="smf:entity[@type='d2501b79-f888-4aa8-9fcf-a667a4c47c84']/smf:value"/>

或在测试时

<xsl:when test="$tcbrand/smf:value='Direct'">
于 2012-11-26T15:35:48.633 回答
0

在您的示例中,您的变量似乎tcbrand包含一个文档节点而不是文本字符串。

我怀疑它Direct在您的示例中打印的原因是因为这是所选节点的文本内容。这将在 test 属性中评估为 false ,因为变量不包含文字 string Direct

要从选定的注释中选择文本值,请/text()在变量声明中使用,例如

 <xsl:variable name="tcbrand" select="smf:entity[@type='d2501b79-f888-4aa8-9fcf-a667a4c47c84']/text()"/>

text()'何时应该在我的 XPath 表达式末尾使用 /text()在网站 xquery.com 上

您可能已经看到很多在 XPath 表达式末尾使用 /text() 的示例,并且您可能想知道,我应该这样做吗?有什么缺点吗?

在某些情况下,您确实希望将 /text() 附加到 XPath 表达式以强制 XQuery 考虑 XPath 表达式的文本值;典型情况是当您想要动态创建结果元素的值时;像这样的东西:

<title>{$doc//book[1]/book-title}</title>

... 生成此输出:

<title>
    <book-title>La Divina Commendia</book-title>
</title>

但是,如果您尝试创建的内容实际上是这样的:

<title>La Divina Commendia</title>

……那么您需要指示 XQuery 使用元素的文本值,一个简单的方法是将 /text() 附加到 XPath 表达式:

<title>{$doc//book[1]/book-title/text()}</title>
于 2012-11-26T14:26:49.517 回答