XSLT选择具有给定值的另一个属性的节点的属性值

时间:2018-06-25 18:09:17

标签: xslt

我有很多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

3 个答案:

答案 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>