Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XPath:无法从所选标记中获取正确的值_Xslt_Xpath - Fatal编程技术网

Xslt XPath:无法从所选标记中获取正确的值

Xslt XPath:无法从所选标记中获取正确的值,xslt,xpath,Xslt,Xpath,这是我关于stackoverflow的第一个问题,所以请不要杀我。 但让我们直奔问题。我有一个给定的xhtml,需要从中获取具体信息 以下是我目前的xsl文件: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://ww

这是我关于stackoverflow的第一个问题,所以请不要杀我。 但让我们直奔问题。我有一个给定的xhtml,需要从中获取具体信息

以下是我目前的xsl文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"
        omit-xml-declaration="no" />
    <xsl:template match="html">
        <xsl:element name="Speisekarte">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation"
                namespace="http://www.w3.org/2001/XMLSchema-instance">Speiseplan_Mensa_Schema.xsd</xsl:attribute>
            <xsl:for-each select=".//table[@class='table module-food-table']">
                <xsl:element name="Speisen">
                    <xsl:element name="namen">
                        <xsl:value-of select="./thead/tr/th[1]" />
                    </xsl:element>
                    <xsl:for-each select="./tbody/tr">
                        <xsl:element name="zutaten">
                            <xsl:value-of select="./td" />
                        </xsl:element>
                        <xsl:element name="preis">
                            <xsl:element name="Studenten">
                                <xsl:value-of select="./td[2]" />
                            </xsl:element>
                            <xsl:element name="Mitarbeiter">
                                <xsl:value-of select="./td[3]" />
                            </xsl:element>
                            <xsl:element name="Gäste">
                                <xsl:value-of select="./td[4]" />
                            </xsl:element>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Speiseplan_Mensa_Schema.xsd
我的问题在于元素“zutaten”。我需要从这个xhtml文件中获取“Rahmsauce中的Hackbällchen”:

<tbody>
                  <tr>
                    <td style="width:70%">
                      Hackbällchen in <sup>(R)</sup> Rahmsauce <sup>(9,G,A,I)</sup>
                      <div class="price hidden-sm hidden-md hidden-lg">
                        <span>1,50&nbsp;&euro;</span><span>2,15&nbsp;&euro;</span><span>2,80&nbsp;&euro;</span>
                      </div>
                    </td>
                    <td class="hidden-xs" style="text-align:center">
                      1,50&nbsp;&euro;
                    </td>
                    <td class="hidden-xs" style="text-align:center">
                      2,15&nbsp;&euro;
                    </td>
                    <td class="hidden-xs" style="text-align:center">
                      2,80&nbsp;&euro;
                    </td>
                  </tr>
                </tbody>

拉赫姆苏斯(R)的哈克巴肯(9,G,A,I)
1,50欧元;2,15欧元;;2,80欧元;
1,50欧元;
2,15欧元;;
2,80欧元;
我试过:

<xsl:value-of select="./td/text()" />

这给了我这个:Rahmsauce的Hackbällchen 1,50 2,15欧元2,80欧元 或者我试过:

<xsl:value-of select="./td/text()[not(self::div)]" />

这给了我一个错误

我尝试了很多不同的方法。你们能帮我吗? 希望我的英语足够好,能理解我的问题。
提前谢谢。

您想要的表达方式是

<xsl:value-of select="td[1]/text()" />


通过执行
td/text()
(此处不需要
/
前缀),您将获得所有
td
节点以及所有这些节点下的所有文本。

您缺少第一列上的谓词。XPath
/td
将选择该行中的所有
td
元素。使用
xsl:value of
将生成所选内容的计算文本值,该值恰好是所有td元素(包括
text()
节点子体)。您可以通过将
xsl:value of
更改为
xsl:copy of
来验证这一点


如果只需要第一列
td
中的
text()
,请使用
td[1]/text()

关于样式的注释,类似于XPath中不必要的
/
。如果元素名是静态的,
xsl:element
xsl:attribute
可以替换为更易于阅读的文本元素和属性构造函数,因为它们看起来像您的输出。i、 e.