为什么撇号会在xsl的test属性上抛出错误:when

时间:2011-10-21 04:22:46

标签: xml xslt xpath

我有一个场景,我应该检查一个实体的教育水平是否等于'学士学位/本科学位'但是编译器会抛出一个错误,说“表达的预期结束,找到了'。” / p>

这是我的实际代码:

        <xsl:when test="education_level='Bachelor's Degree/Undergraduate Degree'">
          <opleiding>
            <xsl:attribute name="id">
              <xsl:value-of disable-output-escaping="yes" select="'30001'"/>
            </xsl:attribute>
            <xsl:value-of disable-output-escaping="yes" select="'Specialisation'"/>
          </opleiding>
        </xsl:when>

欢迎大家帮忙:)提前感谢

5 个答案:

答案 0 :(得分:4)

您可以使用变量:

<xsl:variable name="s">Bachelor's Degree/Undergraduate Degree</xsl:variable>

然后:

<xsl:when test="education_level = $s">

答案 1 :(得分:2)

可以在test属性中指定XPath表达式,而不必依赖其他变量及其文本节点子项

    <xsl:when test="education_level=&quot;Bachelor&apos;s Degree/Undergraduate Degree&quot;">

这是一个完整的转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:choose>
        <xsl:when test="education_level=&quot;Bachelor&apos;s Degree/Undergraduate Degree&quot;">
            <opleiding>
                <xsl:attribute name="id">
                    <xsl:value-of select="'30001'"/>
                </xsl:attribute>
                <xsl:value-of select="'Specialisation'"/>
            </opleiding>
        </xsl:when>
     </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<t>
 <education_level>Bachelor's Degree/Undergraduate Degree</education_level>
</t>

产生了想要的正确结果

<opleiding id="30001">Specialisation</opleiding>

附加说明:您需要DOE,在这种特殊情况下,它将被忽略或产生错误 - 这是因为DOE仅在指令上被允许创建文本节点 - 而不是属性。

答案 2 :(得分:1)

根据您需要转义的引号/撇号是XML属性分隔符(外部引号)还是XPath字符串分隔符(内部引号),您需要不同的策略。

对于XML属性分隔符,请使用XML预定义实体&quot;&apos;

对于XPath字符串分隔符,在XPath 2.0中,您可以通过加倍(例如在SQL中)来转义它们,例如select="'I won''t'"。在XPath 1.0中,没有办法转义字符串分隔符,因此您需要一种解决方法,例如使用变量,连接或切换使用双引号和单引号。在实践中,我通常会使用已经显示的变量。

答案 3 :(得分:-1)

逃离'in'学士学位“ - 你现在有education_level='Bachelor'然后s Degree/Undergraduate Degree'。试试education_level='Bachelor\'s Degree/Undergraduate Degree'

答案 4 :(得分:-1)

以下是您在问题中的标记:

test="education_level='Bachelor's Degree/Undergraduate Degree'"

我会第一个说我对xslt文件一无所知。 XML样式表?我不确定。无论它的目的是什么,任何解析器都会遇到同样的问题,因为你已经将名称/值对作为名称/值对的值包含在内,并且会导致问题。内部单引号(在Bachelor中)没有被解析为字符串中的文字引号,它被解析为值的结尾,即解析器正在解析事物为test作为名字,并且它的值是education_level='Bachelor'的名称/值对,后跟一些它不知道如何处理的东西:s Degree/Undergraduate Degree '

在大多数语言中,您必须转义内部引号,以便将它们视为字符串中的字符,而不是表示字符串结尾的语法字符。试试这个第一个标签:

<xsl:when test="education_level='Bachelor\'s Degree/Undergraduate Degree'">

\是大多数语言中的转义字符,也应该是xslt。