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



查询的目的是获取第一个子元素及其值,其中对应的父元素应该有多个子元素。

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

这是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>

条件使用名称解析元素

使用

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

相关内容

  • 没有找到相关文章

最新更新