选择具有多个子元素的父元素和第一个子元素

时间:2016-06-09 09:36:02

标签: xml xpath xslt-1.0

查询是获取带有它的值的第一个子元素,其中相应的父元素应该有多个子元素。

这里,棘手的问题是动态生成父元素和子元素。即我们不知道父母和子女的名字

这是XML输入:

<PageTwo>
			<List25>No</List25>
			<List11>Air Gun|Gun</List11>
			<Multilist02>
				<Value>.204</Value>
				<Value>.22</Value>
				<Value>.243</Value>
			</Multilist02>
			<Multilist05>
				<Value>Air Gun|NOS|NOS</Value>
				<Value>Optic|Binocular|ZULU5</Value>
			</Multilist05>
			<List23>DAK</List23>
			<Text01>NA</Text01>
			<List13>EA</List13>
			<List26>No</List26>
			<List07>IN</List07>
			<List08>LB</List08>
		</PageTwo>  

在上面的XML中, Multilist 包含多个子值,并且必须使用Value

提取第一个子元素

样本[例外]输出

            <Multilist02>
			    <Value>.204</Value>
			</Multilist02>
			<Multilist05>
				<Value>Air Gun|NOS|NOS</Value>
			</Multilist05>

正如我之前所说,在传入的xml中,我们不知道父元素和子元素的名称是什么。

我在XSLT下面尝试并且能够提取第一个孩子但是无法用相应的父元素覆盖孩子

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.oracle.com/webfolder/technetwork/xml/plm/2014/08/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/xml/plm/2014/08/ http://www.oracle.com/webfolder/technetwork/xml/plm/2014/08/aXML.xsd">
<xsl:template match="/"> 
<xsl:for-each select="/PageTwo/*">
<xsl:for-each select="*">
 <xsl:variable name="i" select="position()" />
<xsl:if test="$i = 1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

生成的输出是:

<?xml version="1.0" encoding="UTF-8"?><Value>.204</Value><Value>Air Gun|NOS|NOS</Value>

请帮助我解决这个问题

编辑:以下答案解决了我接受为答案的上述问题

在上面的XML输入文件中添加一个查询,并向根节点添加属性。

新输入:向根节点添加属性

<PageTwo  xmlns="http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/ http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/aXML.xsd" creator="admin, nawaz(nawaz)">
			<List25>No</List25>
			<List11>Air Gun|Gun</List11>
			<Multilist02>
				<Value>.204</Value>
				<Value>.22</Value>
				<Value>.243</Value>
			</Multilist02>
			<Multilist05>
				<Value>Air Gun|NOS|NOS</Value>
				<Value>Optic|Binocular|ZULU5</Value>
			</Multilist05>
			<List23>DAK</List23>
			<Text01>NA</Text01>
			<List13>EA</List13>
			<List26>No</List26>
			<List07>IN</List07>
			<List08>LB</List08>
		</PageTwo>  

假设我想要用他们的名字解析元素而不是在下面的解决方案中指定*我接受了答案

当前回答

<xsl:template match="/">
  <xsl:apply-templates select="*/*[*[2]]"/>
</xsl:template>

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@* | *[1]"/>
  </xsl:copy>
</xsl:template>

即使我能够通过在根节点中不存在属性时指定相应的名称来解析元素。但我想用他们的名称解析元素和根节点属性来显示

例外解决方案

<?xml version="1.0" encoding="UTF-8"?><PageTwo xmlns="http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/ http://www.oracle.com/webfolder/technetwork/xml/plm/2/2/aXML.xsd" creator="admin, nawaz(nawaz)">
  <Multilist02>
			    <Value>.204</Value>
  </Multilist02>
  <Multilist05>
				<Value>Air Gun|NOS|NOS</Value>
  </Multilist05>
</PageTwo>

条件使用名称

解析元素

1 个答案:

答案 0 :(得分:0)

使用

<xsl:template match="/">
  <xsl:apply-templates select="*/*[*[2]]"/>
</xsl:template>

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@* | *[1]"/>
  </xsl:copy>
</xsl:template>