从xsl查找变量的节点:xsl:for-each中的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从xsl查找变量的节点:xsl:for-each中的变量相关的知识,希望对你有一定的参考价值。

情况

我得到了这样的数据结构:

<datanodes>
  <data>
    <id>1</id>
    <dataEntries>
      <dataEntry>
        <name>start_date</name>
        <entryValue>01-02-2020</entryValue>
     </dataEntry>
     <dataEntry>
        <name>boarding_date</name>
        <entryValue>15-02-2020</entryValue>
     </dataEntry>
    </dataEntries>
  </data>
  <data>
    <id>2</id>
    <dataEntries>
      <dataEntry>
        <name>start_date</name>
        <entryValue>02-03-2020</entryValue>
      </dataEntry>
      <dataEntry>
        <name>departure_date</name>
        <entryValue>15-03-2020</entryValue>
      </dataEntry>
    </dataEntries>
  </data>
</datanodes>

计划是建立一个具有csv文件'la'的结构>

<table>
  <row>
     <col>1</col>
     <col>01-02-2020</col>
     <col>15-02-2020</col>
     <col></col>
  </row>
  <row>
     <col>2</col>
     <col>02-03-2020</col>
     <col></col>
     <col>15-03-2020</col>
  </row>
</table>

目前,我通过循环遍历所有节点并将数据条目的不同名称放入变量,然后将名称打印到col列表中,正确地建立了标题:

<xsl:variable name="headers" select="distinct-values(//name/.)" />
<xsl:for-each select="$headers">
  <col><xsl:value-of select="current()"/></col>
</xsl:for-each>

然后,我还可以通过xpath查找从与名称匹配的节点中获取正确的值

  <xsl:for-each select="data">
    <col><xsl:value-of select="dataEntries/dataEntry[contains(name, 'start_date')]/entryValue" /></col>
  </xsl:for-each>

但是由于我想保持数据结构的灵活性,所以我想遍历变量中收集的数据条目,如果它在当前节点中存在,则打印该值,否则打印一个空标签

我的想法是循环遍历变量,检查当前数据中是否存在具有给定名称的节点,并且是否确实复制了数据,否则仅打印一个空的col

标记。

这里是我到目前为止所得到的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="headers" select="distinct-values(//name/.)"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="datanodes">
    <table>
        <row>
            <xsl:for-each select="$headers">
                <col>
                    <xsl:value-of select="current()"/>
                </col>
            </xsl:for-each>
        </row>
        <xsl:for-each select="data">
            <row>
                <col>
                    <xsl:value-of select="id"/>
                </col>
                <xsl:for-each select="$headers">
                    <xsl:choose>
                        <xsl:when test="dataEntries/dataEntry/current()">
                        <col>
                            <xsl:value-of select="dataEntries/dataEntry[contains(name, current())]/entryValue"/>
                        </col>
                    </xsl:when>
                    <xsl:otherwise>
                        <col/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </row>
    </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

问题

我使用的第二个for-each循环似乎在另一个范围内,因此我无法从外部for-each循环访问该节点

即使我尝试:

<xsl:for-each select="$headers">
  <xsl:value-of select="dataEntries/dataEntry[contains(name, 'start_date')]/entryValue"/>
</xsl:for-each>

而不是

<xsl:for-each select="$headers">
   <xsl:choose>
      <xsl:when test="dataEntries/dataEntry/current()">
         <col>
            <xsl:value-of select="dataEntries/dataEntry[contains(name, current())]/entryValue"/>
         </col>
      </xsl:when>
      <xsl:otherwise>
         <col/>
      </xsl:otherwise>
   </xsl:choose>
</xsl:for-each>

找不到节点。当我将它移到for-each之外时,可以毫无问题地找到该节点

情况我得到了这样的数据结构:[1

答案
None

以上是关于从xsl查找变量的节点:xsl:for-each中的变量的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 xsl for-each 中使用“和”运算符吗?

XSL 风格:在 XSLT 中使用 <xsl:for-each select> 或 <xsl:template match> 或其他解决方案?

如何在xsl中检查for-each是否为空?

如何在已排序的 xsl:for-each 循环中访问前一个和下一个元素的值

XSL 节点集:不按名称查找子元素

xsl for-each多重结果过滤