【问题标题】:Select parent and first child element which has more than one child element选择具有多个子元素的父元素和第一个子元素
【发布时间】:2016-06-09 09:36:02
【问题描述】:

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

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

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

生成的输出是:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;Value&gt;.204&lt;/Value&gt;&lt;Value&gt;Air Gun|NOS|NOS&lt;/Value&gt;

请帮我解决这个问题

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

在上述 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>

条件解析元素名称

【问题讨论】:

  • &lt;Multilist02&gt; &lt;Value&gt;.204&lt;/Value&gt; &lt;/Multilist02&gt; &lt;Multilist05&gt; &lt;Value&gt;Air Gun|NOS|NOS&lt;/Value&gt; &lt;/Multilist05&gt; 是你想要的完整输出,没有其他元素,没有根元素吗?
  • @MartinHonnen 是的,我只想要 .204Air Gun|NOS|NOS

标签: xml xpath xslt-1.0


【解决方案1】:

使用

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

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

【讨论】:

  • 感谢您的帮助。想知道“@* | *[1]”的用法。假设如果在上述 XML 之上再添加一个超级父级,它会起作用吗?
  • 如果您有更多级别,请编辑您的问题并向我们展示该示例和您想要的相应输出,以及确定您想要的输出的规则。目前&lt;xsl:apply-templates select="*/*[*[2]]"/&gt; 处理根元素的所有至少有两个子元素的子元素,然后第二个模板简单地对这些元素进行浅拷贝,并复制第一个子元素。
  • 我明白了,如果我们有更大的父元素,那么我们可以通过添加 /* 来解析级别数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多