首页 文章

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

提问于
浏览
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提取第一个子元素

样本[Excepted]输出

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

请帮我解决这个问题

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

通过向根节点添加属性,在上面的XML输入文件上再添加一个查询 .

New Input: 已向根节点添加了属性

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

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

Current answer

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

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

甚至我也可以通过在 attributes are not present in the root node 时指定相应的名称来解析元素 . 但我想用他们的名称解析元素以显示根节点属性

Excepted Solution

<?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>

condition 使用其名称解析元素

1 回答

  • 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>
    

相关问题