XSLT 匹配 xhtml 命名空间

XSLT matching xhtml namespace

提问人:Corinna 提问时间:10/26/2023 更新时间:10/27/2023 访问量:38

问:

日安

我正在尝试使用此命令行将从 html 文件生成的 xhtml 文件中的“head”元素与 HTML 整洁标记校正器进行匹配:

tidy -asxml -output test_tidy.html --numeric-entities yes .\test.html

test_tidy.html包含以下 xmlns 命名空间:

 <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>

此 XSLT 模板匹配对我不起作用:

<xsl:template match="//head">

我错过了什么? 理想情况下,我想使用相同的样式表来处理带有或不带有 xmlns 命名空间声明的 XHTML 文件,例如处理此文件:

 <!DOCTYPE html>
        <html>
               <head>

感激地收到任何帮助。

愿你安好!

xslt xhtml xml 命名空间

评论

0赞 michael.hor257k 10/26/2023
XHTML 文档位于 XHTML 命名空间中。请看这里如何处理它:stackoverflow.com/questions/34758492/...
0赞 Michael Kay 10/27/2023
当然,这个答案有点过时了。今天搜索“XSLT 默认命名空间”会找到 806 个答案。
0赞 michael.hor257k 10/27/2023
@MichaelKay 从提供的 806 个答案中可以学到什么,而这些答案尚未包含在提供的链接中的两个答案中?

答:

0赞 michael.hor257k 10/26/2023 #1

如果希望同一模板与两者中的元素匹配:head

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>

和:

<html>
     <head>

您必须制作模板:

<xsl:template match="x:head|head">

声明 .xmlns:x="http://www.w3.org/1999/xhtml


或者,您可以执行以下操作:

<xsl:template match="*[local-name()='head']">

或(在 XSLT 2.0 或更高版本中):

<xsl:template match="*:head">

但这通常不是好的做法,因为(至少在理论上)其他命名空间中可能存在您不想匹配的其他元素。head

评论

0赞 Corinna 10/27/2023
感谢您令人难以置信的全面回答,用这么短的文字提供如此多的信息!现在我完全清楚了。