从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之外时,可以毫无问题地找到该节点
情况我得到了这样的数据结构:
答案
None以上是关于从xsl查找变量的节点:xsl:for-each中的变量的主要内容,如果未能解决你的问题,请参考以下文章
XSL 风格:在 XSLT 中使用 <xsl:for-each select> 或 <xsl:template match> 或其他解决方案?