【问题标题】:Select value of xml inner data with xslt for-loop?使用 xslt for-loop 选择 xml 内部数据的值?
【发布时间】:2021-04-07 15:38:30
【问题描述】:

如何在for-each循环中选择xml/xslt中元素节点的内部值而不改变给定的xml格式。

XML:

<folio name="f1r" wordCount="210" width="1090" height="1500">
<word index="0" x="97" y="128" width="106" height="96">fachys</word>
<word index="1" x="225" y="164" width="58" height="61">ykal</word>
...
</folio>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<body>
  <h2>Folio Info</h2>

    <table border="1">
        <tr bgcolor="#9acd32">
          <th style="text-align:left">Folio Name</th>
          <th style="text-align:left">Word Count</th>
          <th style="text-align:left">width</th>
          <th style="text-align:left">height</th>
        </tr>
        <xsl:for-each select="folio">
        <tr>
          <td><xsl:value-of select="@name"/></td>
          <td><xsl:value-of select="@wordCount"/></td>
          <td><xsl:value-of select="@width"/></td>
          <td><xsl:value-of select="@height"/></td>
        </tr>
        </xsl:for-each>
      </table>
    <table border="1">
        <tr bgcolor="#9acd32">
          <th style="text-align:left">index</th>
          <th style="text-align:left">Wordnnnnnnnnnn</th>
          <th style="text-align:left">x loc</th>
          <th style="text-align:left">y loc</th>
          <th style="text-align:left">height</th>
          <th style="text-align:left">width</th>
        </tr>
        <xsl:for-each select="folio/word">
        <tr>
          <td><xsl:value-of select="@index"/></td>
          <td><xsl:value-of select="../word"/></td>
          <td><xsl:value-of select="@x"/></td>
          <td><xsl:value-of select="@y"/></td>
          <td><xsl:value-of select="@height"/></td>
          <td><xsl:value-of select="@width"/></td>
        </tr>
        </xsl:for-each>
      </table>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>

结果:

如您所见,它重复“fachys”而不是“ykal”。它对所有节点都这样做,我刚刚截取了前五个节点。但问题是我不想只是将值变成它自己的属性或子节点,因为所有数据都已经是这样了。自从我擅长 xml 以来已经有一段时间了,所以我有点生疏了。有什么想法吗?

【问题讨论】:

  • 请张贴minimal reproducible example 显示输入、您当前的代码和预期的输出作为代码,而不是图片。
  • 完成@michael.hor257k

标签: xml xslt value-of


【解决方案1】:

这没有意义。

<xsl:for-each select="folio/word">
  <!-- ... -->
  <td><xsl:value-of select="../word"/></td>
  <!-- ... -->
</xsl:for-each>

你想要

<xsl:for-each select="folio/word">
  <!-- ... -->
  <td><xsl:value-of select="."/></td>
  <!-- ... -->
</xsl:for-each>

第一个代码转到&lt;word&gt;“对于每个&lt;word&gt;),从那里,XPath ../word 上升一级(到&lt;folio&gt;)并选择所有再次&lt;word&gt;s。当你给多个节点赋值时,它只会考虑第一个节点。这就是为什么您不断收到fachys 的原因。

当你想输出当前节点时使用.

【讨论】:

  • 谢谢。如此简单,我不知道我是怎么错过的。尝试了其他一切。他们应该把它放在 w3 文档上。
  • @jsky 我很确定它在文档中。但是话又说回来,一旦您对导航在 XSLT 中的工作方式有了一个心智模型,这将非常简单。 :)
  • 是的,检查后我认为它在 xpath 下,我只查看了 xml 和 xslt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2011-12-15
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多