为什么IF条件会在XSLT中产生意外结果?

时间:2016-12-09 04:38:25

标签: jquery xml xslt xslt-1.0 xslt-2.0

我在XSLT中演示了IF条件 我希望在textid匹配时打印任意node id。我从这里阅读文件:

https://msdn.microsoft.com/en-us/library/ms256209(v=vs.110).aspx

我使用了xsl:if语法。但它没有打印<p>标记值 这是指向XSLTTransform for my problem的链接。

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
        <publish_date>2000-10-01</publish_date>
        <description>An in-depth look at creating applications with
            XML.</description>
    </book>
    <book id="bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>A former architect battles corporate zombies,
            an evil sorceress, and her own childhood to become queen of the
            world.</description>
    </book>
    <book id="bk103">
        <author>Corets, Eva</author>
        <title>Maeve Ascendant</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-11-17</publish_date>
        <description>After the collapse of a nanotechnology society
            in England, the young survivors lay the foundation for a new
            society.</description>
    </book>
</catalog>

我希望在图书ID为&#39; bk101&#39;时显示jjj

这是我的XSLT代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="book">
            <xsl:if test="@id =bk101">
                <p>jjj</p>
            </xsl:if>
    </xsl:template>    
</xsl:stylesheet>

但它没有按预期工作。

2 个答案:

答案 0 :(得分:3)

用于选择book元素的id属性与'bk101'的值匹配的所有book个节点的正确XPath表达式是

book[@id='bk101']

因此,完整的XSLT模板如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="book[@id='bk101']">
    <p>jjj</p>
  </xsl:template>    
</xsl:stylesheet>

答案 1 :(得分:1)

@ zx485是正确的,在大多数情况下谓词可能会产生更接近你想要的行为。

那就是说,你的xsl:if表达式会起作用 - 只有一个变化。您当前的代码包含此测试:

<xsl:if test="@id =bk101">

阻止此功能正常工作的关键问题是引号 - 或者更确切地说,您缺少引号。

您的test上方bk101不加引号 - 因此XPath引擎将此标识为元素名称,因此您最终将属性id的值与非值的值进行比较 - 存在元素bk101。您需要将bk101放在引号中以强制XPath引擎将其作为字符串进行评估。 (在这里使用单引号,以避免与定义test表达式的双引号的语法冲突。)固定行看起来像这样:

<xsl:if test="@id = 'bk101'">

运行相同的代码,修改为添加单引号,在示例输入文件的快速和脏转换中为我生成此输出:

<?xml version="1.0" encoding="UTF-8"?>
<p>jjj</p>