[英]XSLT transform with repeating elements and parent node
我正在尝试将下面的xml转换为行和列。 Job_Classification_Group
可以有许多子Job_Classifications
。 我需要Job_Classification_Group_ID
首先出现在所有行中,然后是有关该Job_Classification_Group
的信息,然后是每个Job_Classification_Reference_ID
换一种说法:
Job_Classification_Group_ID | wd:ID | wd:Effective_Date | wd:Job_Classification_Group_Name | wd:Location_Reference [2] | wd:Location_Reference [3] | wd:Location_Reference [4] | wd:Job_Classification_Data / Job_ification_d_ | ID | ID:1 :EFFECTIVE_DATE | WD:Job_Classification_Group_Name | WD:Location_Reference [2] | WD:Location_Reference [3] | WD:Location_Reference [4] | WD:Job_Classification_Data / Job_Classification_Reference_ID [2]
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<wd:Get_Job_Classification_Groups_Response wd:version="v29.1" xmlns:wd="urn:com.workday/bsvc">
<wd:Response_Filter>
<wd:Page>3</wd:Page>
<wd:Count>1</wd:Count>
</wd:Response_Filter>
<wd:Response_Group>
<wd:Include_Reference>1</wd:Include_Reference>
<wd:Include_Job_Classifications>1</wd:Include_Job_Classifications>
</wd:Response_Group>
<wd:Response_Results>
<wd:Total_Results>21</wd:Total_Results>
<wd:Total_Pages>21</wd:Total_Pages>
<wd:Page_Results>1</wd:Page_Results>
<wd:Page>3</wd:Page>
</wd:Response_Results>
<wd:Response_Data>
<wd:Job_Classification_Group>
<wd:Job_Classification_Group_Reference wd:Descriptor="Klassifikation der Berufe 2010 (KldB 2010)">
<wd:ID wd:type="WID">16d569ce573c01b6725820441e3b7049</wd:ID>
<wd:ID wd:type="Job_Classification_Group_ID">KldB2010_Germany</wd:ID>
</wd:Job_Classification_Group_Reference>
<wd:Job_Classification_Group_Name_Data>
<wd:Job_Classification_Group_Name>Klassifikation der Berufe 2010 (KldB 2010)</wd:Job_Classification_Group_Name>
</wd:Job_Classification_Group_Name_Data>
<wd:Job_Classification_Group_Data>
<wd:ID>KldB2010_Germany</wd:ID>
<wd:Effective_Date>2018-04-18-07:00</wd:Effective_Date>
<wd:Job_Classification_Group_Name>Klassifikation der Berufe 2010 (KldB 2010)</wd:Job_Classification_Group_Name>
<wd:Location_Reference wd:Descriptor="Germany">
<wd:ID wd:type="WID">dcc5b7608d8644b3a93716604e78e995</wd:ID>
<wd:ID wd:type="ISO_3166-1_Alpha-2_Code">DE</wd:ID>
<wd:ID wd:type="ISO_3166-1_Alpha-3_Code">DEU</wd:ID>
<wd:ID wd:type="ISO_3166-1_Numeric-3_Code">276</wd:ID>
</wd:Location_Reference>
<wd:Inactive>0</wd:Inactive>
<wd:Job_Classification>
<wd:Job_Classification_Reference wd:Descriptor="1 - Land-, Forst- und Tierwirtschaft und Gartenbau (Klassifikation der Berufe 2010 (KldB 2010)-Germany)">
<wd:ID wd:type="WID">16d569ce573c0159e47b20441e3b7149</wd:ID>
<wd:ID wd:type="Job_Classification_Reference_ID">KldB2010_Germany_1_Land-,_Forst-_und_Tierwirtschaft_und_Gartenbau</wd:ID>
</wd:Job_Classification_Reference>
<wd:Job_Classification_Data>
<wd:ID>KldB2010_Germany_1_Land-,_Forst-_und_Tierwirtschaft_und_Gartenbau</wd:ID>
<wd:Job_Classification_ID>1</wd:Job_Classification_ID>
<wd:Description>Land-, Forst- und Tierwirtschaft und Gartenbau</wd:Description>
<wd:Inactive>0</wd:Inactive>
</wd:Job_Classification_Data>
</wd:Job_Classification>
<wd:Job_Classification>
<wd:Job_Classification_Reference wd:Descriptor="11 - Land-, Tier- und Forstwirtschaftsberufe (Klassifikation der Berufe 2010 (KldB 2010)-Germany)">
<wd:ID wd:type="WID">16d569ce573c016e488520441e3b7249</wd:ID>
<wd:ID wd:type="Job_Classification_Reference_ID">KldB2010_Germany_11_Land-,_Tier-_und_Forstwirtschaftsberufe</wd:ID>
</wd:Job_Classification_Reference>
<wd:Job_Classification_Data>
<wd:ID>KldB2010_Germany_11_Land-,_Tier-_und_Forstwirtschaftsberufe</wd:ID>
<wd:Job_Classification_ID>11</wd:Job_Classification_ID>
<wd:Description>Land-, Tier- und Forstwirtschaftsberufe</wd:Description>
<wd:Inactive>0</wd:Inactive>
</wd:Job_Classification_Data>
</wd:Job_Classification>
</wd:Job_Classification_Group_Data>
</wd:Job_Classification_Group>
</wd:Response_Data>
</wd:Get_Job_Classification_Groups_Response>
</env:Body>
</env:Envelope>
我有一个简单的XSLT,无需Job_Classification_Reference_ID
即可构建它
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday/bsvc" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="newline">
<xsl:text>¦</xsl:text>
</xsl:variable>
<xsl:variable name="comma">
<xsl:text>,</xsl:text>
</xsl:variable>
<xsl:variable name="quote">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="rs">
<xsl:text>|</xsl:text>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="/env:Envelope/env:Body/wd:Get_Job_Classification_Groups_Response/wd:Response_Data"/>
</xsl:template>
<xsl:template match="/env:Envelope/env:Body/wd:Get_Job_Classification_Groups_Response/wd:Response_Data">
<xsl:for-each select="wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Job_Classification/wd:Job_Classification_Reference/wd:ID[2]">
<xsl:value-of select="../../../wd:ID"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Effective_Date"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Job_Classification_Group_Name"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Inactive"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Location_Reference/wd:ID[2]"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Location_Reference/wd:ID[3]"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="../../../wd:Location_Reference/wd:ID[4]"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:value-of select="$newline"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
哪个输出:
KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_1_Land-,_Forst-_und_Tierwirtschaft_und_Gartenbau¦KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_11_Land-,_Tier-_und_Forstwirtschaftsberufe
哪个接近,但没有Job_Classification_Group_ID
我无法弄清楚如何保留重复的Job_Classification_Reference_ID
同时还要添加Job_Classification_Group_ID
。 我尝试创建另一个模板,该模板从循环内部被调用,但出现错误(使用XMLSpy)。 该模板将仅输出Job_Classification_Reference_ID
值。
编辑:预期的输出
KldB2010_Germany|KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_1_Land-,_Forst-_und_Tierwirtschaft_und_Gartenbau¦
KldB2010_Germany|KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_11_Land-,_Tier-_und_Forstwirtschaftsberufe
但第一列Job_Classification_Group_ID
从wd:Job_Classification_Group_Reference
。 不是wd:Job_Classification_Group_Data
。 那是第二栏
有一些建议可以实现所需的输出。 要求是获得
<xsl:value-of select="wd:Job_Classification_Reference/wd:ID[@wd:type='Job_Classification_Reference_ID']"/>
在输出文本中的单独行上。 为了做到这一点, <xsl:for-each>
应该在<wd:Job_Classification>
而不是wd:Job_Classification/wd:Job_Classification_Reference/wd:ID[2]
。
其次,在这种特定情况下,最好使用ancestor::
轴,而不是使用../../../
来访问父节点值,这将有助于轻松创建XPath并导航至必需的节点。 仅查看XSLT代码,也有助于了解正在访问哪个元素值。
第三,与其使用wd:ID[2]
, wd:ID[3]
, wd:ID[4]
访问值, @wd:type
使用@wd:type
属性值即wd:ID[@wd:type='ISO_3166-1_Alpha-2_Code']
,以此类推。 这将确保即使输入中wd:ID
元素的顺序发生更改,输出也不会更改。
根据以上建议,对wd:ResponseData
模板进行了如下修改。
<xsl:template match="/env:Envelope/env:Body/wd:Get_Job_Classification_Groups_Response/wd:Response_Data">
<xsl:for-each select="wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Job_Classification">
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Reference/wd:ID[@wd:type='Job_Classification_Group_ID']" />
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:ID" />
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Effective_Date"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Job_Classification_Group_Name"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Inactive"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Location_Reference/wd:ID[@wd:type='ISO_3166-1_Alpha-2_Code']"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Location_Reference/wd:ID[@wd:type='ISO_3166-1_Alpha-3_Code']"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="ancestor::wd:Job_Classification_Group/wd:Job_Classification_Group_Data/wd:Location_Reference/wd:ID[@wd:type='ISO_3166-1_Numeric-3_Code']"/>
<xsl:value-of select="$rs"/>
<xsl:value-of select="wd:Job_Classification_Reference/wd:ID[@wd:type='Job_Classification_Reference_ID']"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$newline"/>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
这将生成所需的输出
KldB2010_Germany|KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_1_Land-,_Forst-_und_Tierwirtschaft_und_Gartenbau¦
KldB2010_Germany|KldB2010_Germany|2018-04-18-07:00|Klassifikation der Berufe 2010 (KldB 2010)|0|DE|DEU|276|KldB2010_Germany_11_Land-,_Tier-_und_Forstwirtschaftsberufe
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.