我有很多html文件,例如以下01.html文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Title</title>
</head>
<body>
<item itemprop="itemprop1" content="content1" />
<item itemprop="itemprop2" content="content2" />
<item itemprop="itemprop3" content="content3" />
<item itemprop="itemprop4" content="content4" />
<item itemprop="itemprop5" content="content5" />
<item itemprop="itemprop6" content="content6" />
<item itemprop="itemprop7" content="content7" />
<item itemprop="itemprop8" content="content8" />
<item itemprop="itemprop9" content="content9" />
</body>
</html>
每个html文件中只有一个item节点具有itemprop =“ itemprop1”。与itemprop2,itemprop3等相同。
我希望输出以下txt文件:
content1 | content 5
是以下内容的串联: 1.使用itemprop =“ itemprop1”的商品的属性内容的值 2.管道“ |” 3.使用itemprop =“ itemprop5”
的商品的属性内容的值我运行以下bash脚本:
xsltproc 01.xslt 01.html >> 02.txt
其中01.xslt是以下内容:
<?xml version="1.0"?>
<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="body">
<xsl:value-of select="//item[@itemprop='itemprop1']/@content"/>|<xsl:value-of select="item[@itemprop='itemprop5']/@content"/>
</xsl:template>
</xsl:stylesheet>
不幸的是,它不起作用。什么是正确的xslt文件?
更新
这是最终的工作示例。
01.html如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Title</title>
</head>
<body>
<item itemprop="itemprop1" content="content1" />
<item itemprop="itemprop2" content="content2" />
<item itemprop="itemprop3" content="content3" />
<item itemprop="itemprop4" content="content4" />
<item itemprop="itemprop5" content="content5" />
<item itemprop="itemprop6" content="content6" />
<item itemprop="itemprop7" content="content7" />
<item itemprop="itemprop8" content="content8" />
<item itemprop="itemprop9" content="content9" />
</body>
</html>
01.xslt如下:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="html">
<xsl:value-of select="//item[@itemprop='itemprop1']/@content"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="//item[@itemprop='itemprop5']/@content"/>
</xsl:template>
</xsl:stylesheet>
,输出02.txt如下:
content1|content5
答案 0 :(得分:2)
实际上,XSTL处理 XML 文件而不是 HTML 。
您的源HTML 几乎符合格式正确的要求
XML。只有一个错误:meta
元素未关闭,
所以我将其更改为:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
(在结束/
之前添加>
)。
否则,XSLT处理器会显示错误消息(至少在
我的安装)。
就您的XSLT而言,我做了一些更正:
match="body"
更改为match="html"
,//
中添加了xsl:value-of
,|
更改为<xsl:text>|</xsl:text>
可读性的原因(较小的线条看不到较长的线条
监视器),<xsl:output method="text"/>
,因为您的输出没有
似乎是任何XML。最后2项更改是可选的,您可以忽略它们。
因此整个脚本如下所示:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="html">
<xsl:value-of select="//item[@itemprop='itemprop1']/@content"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="//item[@itemprop='itemprop5']/@content"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
使用xsltproc
的主要问题是您试图处理HTML而不是XML。区别在于<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
标记没有关闭,因此XSLT处理器没有有效的XML(导致错误)。因此,添加一个结束字符使其成为
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
如果您解决了该问题,并添加了一个模板,该模板可以删除“ {@ 1}}个“不匹配”节点,例如
text()
您的XSLT会做您想做的事。
答案 2 :(得分:0)
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select="html/body/item[@itemprop='itemprop1']/@content"/>|<xsl:value-of select="html/body/item[@itemprop='itemprop5']/@content"/>
</xsl:template>