XSLT的新手,我想整理我的XML文件以便(以后)提取到SQL中。目前,我在遍历XML文档时遇到麻烦。目前,它获取标签数量,但将返回相同的值。同样,当循环中存在循环时,似乎根本就没有选择任何值。
XML:
<?xml version="1.0"?>
<Example>
<Num>12</Num>
<Num>13</Num>
<Num>14</Num>
<Num>15</Num>
<Num>16</Num>
<New>N</New>
<Age>118</Age>
<Name>
<PrimNam>
<Surnm>SAM</Surnm>
<FstNm>SAM</FstNm>
<SecNm>SAM</SecNm>
</PrimNam>
<Alias>
<Id>12</Id>
<DOB>01/01/1900</DOB>
<AliasNam>
<Surnm>SAM</Surnm>
<FstNm>SAMUEL</FstNm>
</AliasNam>
<AliasDate>28/12/2018</AliasDate>
</Alias>
</Name>
</Example>
这是我的XSLT目前的样子
<xsl:for-each select="Example/Num">
<Num><xsl:value-of select="../Num"/></Num>
</xsl:for-each>
<New><xsl:value-of select="Example/New"/></New>
<Age><xsl:value-of select="Example/Age"/></Age>
<xsl:for-each select="Example/Name/PrimNam">
<Surnm><xsl:value-of select="../../Surnm"/></Surnm>
<FstNm><xsl:value-of select="../../FstNm"/></FstNm>
<SecNm><xsl:value-of select="../../SecNm"/></SecNm>
</xsl:for-each>
<xsl:for-each select="Example/Name/Alias">
<Id><xsl:value-of select="../../Id"/></Id>
<DOB><xsl:value-of select="../../DOB"/></DOB>
<xsl:for-each select="Example/Name/Alias/AliasNam">
<Surnm><xsl:value-of select="../../../Surnm"/></Surnm>
<FstNm><xsl:value-of select="../../../FstNm"/></FstNm>
</xsl:for-each>
<AliasDate><xsl:value-of select="../../AliasDate"/></AliasDate>
</xsl:for-each>
结果显示如下
<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<New>N</NewCon>
<Age>118</Age>
<Surnm></Surnm>
<FstNm></FstNm>
<SecNm></SecNm>
<Id></Id>
<DOB></DOB>
<AliasDate></AliasDate>
答案 0 :(得分:0)
您似乎想要展平XML。
以下是一种XSLT-1.0模板:
<xsl:template match="Example/Num | Example/New | Example/Age | Example/Name/PrimNam/* | Example/Name/Alias/Id | Example/Name/Alias/DOB | Example/Name/Alias/AliasNam/* | Example/Name/Alias/AliasDate">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
输出为:
<Num>12</Num>
<Num>13</Num>
<Num>14</Num>
<Num>15</Num>
<Num>16</Num>
<New>N</New>
<Age>118</Age>
<Surnm>SAM1</Surnm>
<FstNm>SAM2</FstNm>
<SecNm>SAM3</SecNm>
<Id>12</Id>
<DOB>01/01/1900</DOB>
<Surnm>SAM</Surnm>
<FstNm>SAMUEL</FstNm>
<AliasDate>28/12/2018</AliasDate>
这是输入XML的扁平版本。
答案 1 :(得分:0)
说明:
<xsl:for-each select="Example/Num">
使您进入Num
的环境。为了获得价值
当前的Num
,您需要执行以下操作:
<xsl:value-of select="."/>
您的工作:
<xsl:value-of select="../Num"/>
选择当前父级的第一个 Num
子级
节点-每个Num
都相同。
说明:
<xsl:for-each select="Example/Name/PrimNam">
使您进入PrimNam
的环境。为了获得价值
Surnm
从这里开始,您必须这样做:
<xsl:value-of select="Surnm"/>
不是:
<xsl:value-of select="../../Surnm"/>
因为Surnm
是PrimNam
的子。这同样适用于
您无法选择的其他节点。
请注意,您可以使用xsl:copy
来大大缩短样式表-例如:
<xsl:copy-of select="Example/New"/>
代替:
<New><xsl:value-of select="Example/New"/></New>