【问题标题】:xslt xpath finding all element values of a node in xpath queryxslt xpath在xpath查询中查找节点的所有元素值
【发布时间】:2015-08-21 11:27:31
【问题描述】:

这个问题与这个问题xslt xpath using element values in xpath query 相关,但是,xslt 仅适用于两个元素节点 HAS TAXONOMIC LEVEL 并被用作。

请找到以下xml:

<root>
 <html>
  <table class=" table search-results-property-table">  
                 ....
   <tr>
    <td>
     <span class="versal">HAS TAXONOMIC LEVEL</span>
    </td>
    <td>
     <ul>
      <li>
       <a class="versal" href="../../../agrovoc/en/page/c_11125">genus</a>
      </li>
     </ul>
    </td>
   </tr>
   <tr>
    <td>
     <span class="versal">IS USED AS</span>
    </td>
    <td>
     <ul>
      <li>
       <a class="versal" href="../../../agrovoc/en/page/c_1591">christmas trees</a>
      </li>
      <li>
       <a class="versal" href="../../../agrovoc/en/page/c_7776">timber trees</a>
      </li>
     </ul>
    </td>
   </tr>
    ....
  <table>
 </html>
 <html>
     .....      
   <tr>
    <td>
     <span class="versal">ANOTHER HEADING LABEL</span>
    </td>
    <td>
     <ul>
      <li>
       <p>values</p>
      </li>
     </ul>
    </td>
   </tr>
       ....
 </html>
 <html>
   [third data set...]
    ...
 </html>    
<root>

我想在 xpath 中使用 /tr/td/span[@class='versal] 中的元素值 HAS TAXONOMIC LEVEL、IS USED AS 和其他标签。接下来是输出它们的值(例如,HAS TAXONOMIC LEVEL),然后得到兄弟“td”/ul/li/a->属的后代“a”或“p”在HAS TAXONMIC LEVEL和圣诞树和木材下的值IS USED AS 下的树木。最后,获取@href(如果可用)。所以我得到以下信息:

START HERE
=LDR  00000nam  2200000Ia 4500
     ....
=305  \\$aHAS TAXONOMIC LEVEL$bgenus$cc_11125
=305  \\$aIS USED AS$bchrismas trees$cc_1591
=305  \\$aIS USED AS$btimber trees$cc_7776

START HERE
=LDR  00000nam  2200000Ia 4500
      ....
=305  \\$aLABEL$bvalue

START HERE
=LDR  00000nam  2200000Ia 4500
  (third data set and so on..)

请注意,我在此文件中有多个文档,格式如下:

<root>
 <html>
   [DATA SET 1]
         ....
 </html>
      <html>
   [DATA SET 2]
         ....
 </html>
       .....
</root>

我有以下现有的 xslt 来适应它:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

 <xsl:template match="root">
  <xsl:for-each select="html">
  <xsl:text>START HERE</xsl:text>
  <xsl:text>&#13;&#10;</xsl:text>
  <xsl:text>=LDR  00000nam  2200000Ia 4500</xsl:text>
  <xsl:text>&#13;&#10;</xsl:text>
  <xsl:apply-templates select="table/prefterm" />
  <xsl:text>&#13;&#10;</xsl:text>   
  <xsl:apply-templates select="table/tr/td/span" />
  <xsl:text>&#13;&#10;</xsl:text>   
       ....
 </xsl:stylesheet>

感谢和欢呼!

更新2: 使用下面的 xslt:

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>

 <xsl:template match="root">
  <xsl:for-each select="html">
  <xsl:text>START HERE</xsl:text>
  <xsl:text>&#13;&#10;</xsl:text>
  <xsl:text>=LDR  00000nam  2200000Ia 4500</xsl:text>
  <xsl:text>&#13;&#10;</xsl:text>
  <xsl:apply-templates select="table/prefterm" />
  <xsl:text>&#13;&#10;</xsl:text>   
  <xsl:apply-templates select="table/tr/td/span" />
  <xsl:text>&#13;&#10;</xsl:text>   
  <xsl:apply-templates select="table/tr"/>
  <xsl:text>&#13;&#10;</xsl:text>
       .......
 <xsl:template match="table/tr">
  <xsl:for-each select="../tr[td/span/@class='versal']">
   <xsl:variable name="span" select="td/span" />
   <xsl:for-each select="td/ul/li/a">
   <xsl:text>=305  \\$a</xsl:text>
   <xsl:value-of select="$span"/>
   <xsl:text>$c</xsl:text>
   <xsl:value-of select="."/>
   <xsl:text>&#10;</xsl:text>
   </xsl:for-each>
  </xsl:for-each> 
 </xsl:template>

</xsl:stylesheet>

使用这个模板,我得到了许多重复多次的值,这似乎是基于另一个节点的数量,如下所示:

START HERE
=LDR  00000nam  2200000Ia 4500    
 .....
=305  \\$aHAS TAXONOMIC LEVEL$cgenus
=305  \\$aIS USED AS$cchristmas trees
=305  \\$aIS USED AS$ctimber trees
=305  \\$aHAS TAXONOMIC LEVEL$cgenus
=305  \\$aIS USED AS$cchristmas trees
=305  \\$aIS USED AS$ctimber trees

START HERE
=LDR  00000nam  2200000Ia 4500    
 ..... set 2 and also =305 is printed many times

【问题讨论】:

    标签: xml xslt xpath xml-parsing xslt-1.0


    【解决方案1】:

    在上一个问题中,表达式 give 是 this....

    <xsl:for-each select="html/table/tr[td/span='HAS TAXONOMIC LEVEL' or td/span='IS USED AS']">
    

    如果要包含其他值,请将其更改为此...

     <xsl:for-each select="html/table/tr[td/span/@class='versal']">
    

    不过,查看您的输出,您似乎想要为每个 html 元素创建一个新部分,因此可能会将代码放在与 html 匹配的模板中。像这样的...

    <xsl:template match="html">
        <xsl:text>START HERE</xsl:text>
        <xsl:for-each select="table/tr[td/span/@class='versal']">
            <!-- Existing code -->
        </xsl:for-each> 
    </xsl:template>
    

    编辑:要将其放入您的(第二个)XSLT 中,请改用此方法

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
    
     <xsl:template match="root">
       <xsl:for-each select="html">
         <xsl:text>START HERE</xsl:text>
         <xsl:text>&#13;&#10;</xsl:text>
         <xsl:text>=LDR  00000nam  2200000Ia 4500</xsl:text>
         <xsl:text>&#13;&#10;</xsl:text>
         <xsl:for-each select="table/tr[td/span/@class='versal']">
           <xsl:variable name="span" select="td/span" />
           <xsl:for-each select="td/ul/li/a">
             <xsl:text>=305  \\$a</xsl:text>
             <xsl:value-of select="$span"/>
             <xsl:text>$c</xsl:text>
             <xsl:value-of select="."/>
             <xsl:text>&#10;</xsl:text>
           </xsl:for-each>
         </xsl:for-each> 
       </xsl:for-each> 
     </xsl:template>
    </xsl:stylesheet>
    

    现有 XSLT 中的主要问题是您使用 &lt;xsl:for-each select="//table/tr[td/span/@class='versal']"&gt;,但 //table 将获取文档中的所有表格,因此您失去了上下文。你只需要&lt;xsl:for-each select="table/tr[td/span/@class='versal']"&gt;

    【讨论】:

    • 嗨!我实际上有这个现有的 xslt:
    • @schnydszch 如果有帮助,我在答案中包含了完整的 XSLT 示例。
    • 感谢 Tim C。您的回答非常适合解决我的问题,而且我了解到我可以在我的第一个模板中包含 xsl:for-each 内部 xsl:for-each (模板匹配 = “根”)。这就是我失去背景的原因。
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多