簡體   English   中英

具有重復元素和父節點的XSLT變換

[英]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>&#166;</xsl:text>
    </xsl:variable>
    <xsl:variable name="comma">
        <xsl:text>&#44;</xsl:text>
    </xsl:variable>
    <xsl:variable name="quote">
        <xsl:text>&#39;</xsl:text>
    </xsl:variable>
    <xsl:variable name="rs">
        <xsl:text>&#124;</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_IDwd: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>&#xA;</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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM