我有xpath的问题,我需要href链接和其他<a> attributes</a>

时间:2013-11-19 19:21:58

标签: html xml xslt xpath

我需要获取标签的一部分。我的XML就像那样

    <div class="item">
<h2><a href="url.html" title="siomethink">Vyzivovy poradca</a></h2>
...
...
<div class="watch"><a href="sth" data-id="292931" data-active="somethink" data-inactive="blablalba" data-class="monitored" class="watchItem" title="watching"><span>sometihink</span></a></div>
</div>

我需要href属性和“data-id”属性。我的模板看起来像

<xsl:variable name="url" select="xhtml:h2/xhtml:a/href"/>
<xsl:variable name="job_id" select="xhtml:div[@class = 'watch']/xhtml:a/data-id"/>

<job>
<xsl:attribute name="id"><xsl:value-of select="$job_id"/></xsl:attribute>
<url name="url"><xsl:value-of select="$url"/></url>

</job>

标签a的

和模板是:

<xsl:template match="xhtml:a">
<xsl:copy>
    <!-- can not copy href, cause it is not absolute url ! -->
    <xsl:copy-of select="@align|@title|@rel|@itemprop|@itemtype|@itemscope"/>
    <xsl:attribute name="target">_blank</xsl:attribute>
    <xsl:apply-templates select="*|text()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/></xsl:template>
<xsl:template match="text()[ancestor::xhtml:pre]"><xsl:value-of select="etl:regex-replace(., '(\s|\n)+', '$1', 'g')"/></xsl:template>

但它不起作用,有些想法?

1 个答案:

答案 0 :(得分:0)

此输入XML:

<div class="item">
  <h2>
    <a href="url.html" title="siomethink">Vyzivovy poradca</a>
  </h2>
  ...
  ...
  <div class="watch">
    <a href="sth"
       data-id="292931"
       data-active="somethink"
       data-inactive="blablalba"
       data-class="monitored"
       class="watchItem"
       title="watching"><span>sometihink</span></a>
  </div>
</div>

鉴于此XSLT:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="//a[descendant::text() = 'sometihink']">
    <root>
      <href>
        <xsl:value-of select="@href"/>
      </href>
      <data-id>
        <xsl:value-of select="@data-id"/>
      </data-id>
    </root>
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

生成此输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <href>sth</href>
   <data-id>292931</data-id>
</root>

备注:

  • 我假设“sometihink”内容是最独特的 你寻求的a的特征。如果是其他内容(例如父div[@class="watch"]),请告诉我们,我们可以进行调整。

根据OP的评论更新如下:

已更新 XSLT:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <root>
      <item-href>
        <xsl:value-of select="//div[@class='item']/h2/a/@href"/>
      </item-href>
      <watch-data-id>
        <xsl:value-of select="//div[@class='watch']/a/@data-id"/>
      </watch-data-id>
    </root>
  </xsl:template>

</xsl:stylesheet>

鉴于上述输入XML将产生此输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item-href>url.html</item-href>
   <watch-data-id>292931</watch-data-id>
</root>

包含请求的属性值。