如何根据标签的值在xml中遍历到不同的节点
Posted
技术标签:
【中文标题】如何根据标签的值在xml中遍历到不同的节点【英文标题】:How to traverse in the xml based on a value of a tag to a different node 【发布时间】:2017-10-26 16:45:00 【问题描述】:输入 XML
<root>
<data>
<reportable>
<row index="1">
<tn>name1</tn>
</row>
<row index="2">
<tn>name3</tn>
</row>
<row index="3">
<tn>currency</tn>
<value>$</value>
</row>
<row index="4">
<tn>name2</tn>
</row>
</reportable>
<name1 type="table" cols="2" row="1">
<row index="1">
<fname>AAK</fname>
<lname>BB</lname>
</row>
</name1>
<name2 type="table" cols="2" row="1">
<row index="1">
<fname>KA</fname>
<lname>A</lname>
</row>
</name2>
<name3 type="table" cols="2" row="1">
<row index="1">
<fname>Arun</fname>
<lname>Kumar</lname>
</row>
</name3>
</data>
</root>
XSLT 示例
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-
microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root/data/reporttable">
<xsl:for-each select="row" >
<xsl:choose>
<xsl:when test="contains(tn,'name')">
<xsl:call-template name='temp2'>
<xsl:with-param name='pathValue' select="concat('../',tn)"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="tn='currency'">
<curr>
<xsl:value-of select="value"/>
</curr>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="temp2">
<xsl:param name="pathValue"/>
<valueofFname>
<xsl:value-of select="$pathValue/row/fname"/>
</valueofFname>
</xsl:template>
</xsl:stylesheet>
预期输出 XML
<valueofFname>AAK</valueofFname>
<valueofFname>Arun</valueofFname>
<curr>$</curr>
<valueofFname>KA</valueofFname>
这里我已经到了tn,一旦我发现tn的值为“name1”, 然后我想通过连接节点路径转到表 name1 并且必须通过调用另一个模板(temp2)来传递这个参数。 我必须从 name1 表中的 fname 中获取值。即,让它 是我已将参数名称作为“pathValue”传递,值为 “../name1”。我想通过附加来获取路径中的值 /row/fname
然后当我看到 tn 的值作为 name3 时,我必须再次调用 参数 pathValue 与“../name3”相同的模板,就像我一样 上面提到我必须在 name3 表中获取 fname 的值
请帮助遍历 name1、name2 和 name3 节点 基于报告表中“tn”的值。 有人可以帮助我如何设置我想遍历的路径。 在此先感谢
【问题讨论】:
【参考方案1】:您的输出与您的描述不完全相符。我猜你想做类似的事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="elem-by-name" match="*" use="name()" />
<xsl:template match="/root">
<xsl:for-each select="data/reportable/row" >
<xsl:choose>
<xsl:when test="contains(tn, 'name')">
<valueofFname>
<xsl:value-of select="key('elem-by-name', tn)/row/fname"/>
</valueofFname>
</xsl:when>
<xsl:when test="tn='currency'">
<curr>
<xsl:value-of select="value"/>
</curr>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,结果不是格式良好的 XML 文档(没有单个根元素)。
【讨论】:
谢谢迈克尔...现在我可以遍历了以上是关于如何根据标签的值在xml中遍历到不同的节点的主要内容,如果未能解决你的问题,请参考以下文章
java中如何读取xml中数据。多节点的。给我一个例子,谢谢。
如何根据标签的属性名称选择两个标签之间的 xml 文件中的所有节点?