查询的目的是获取第一个子元素及其值,其中对应的父元素应该有多个子元素。
这里,棘手的问题是父元素和子元素是动态生成的。即我们不知道父母和孩子的名字
这是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>