簡體   English   中英

帶有參數和輸出值的調用模板-XSLT

[英]Call Template with Parameter and Output Value - XSLT

我有一個由2個不同的xml文件組成的1個大xml文件。 我想要做的是,當我創建CSV文件時,我希望能夠從與第一部分匹配的文件的第二部分中獲取數據。 我為每個循環使用a來遍歷文件第一部分中的所有數據,然后使用嵌套循環來獲取匹配的數據。 這是XML布局:

<?xml version="1.0" encoding="UTF-8"?>
<Report_Data>
    <Report_Entry>
        <company_id>001</company_id>
        <dept>TestDept</dept>
    </Report_Entry>
    <Report_Entry>
    </Report_Entry>
    <Company_Data>
        <Report_Entry>
            <code>1</code>
            <name>Test1</name>
        </Report_Entry>
        <Report_Entry>
            <code>2</code>
            <name>Test2</name>
        </Report_Entry>
    </Company_Data>
</Report_Data>

我想在CSV文件中將Company_Data節點的名稱插入到company_id之后的輸出中。

這是我的XSL文件(當前不起作用,它循環並為輸出文件中的每個公司數據節點輸出N / A):

<?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">
<xsl:output method="text" encoding="utf-8" media-type="text/plain" />
<xsl:strip-space  elements="*"/>

<xsl:variable name="newline" select="'&#x0A;'" />
<xsl:variable name="tab" select="'&#x09;'" />
<xsl:variable name="comma" select="'&#x2C;'" />
<xsl:variable name="padding" select="'                              '" />

<xsl:variable name="ID" select="concat('COMPANY ID', $padding)" />
<xsl:variable name="NAME" select="concat('COMPANY NAME', $padding)" />
<xsl:variable name="DEPT" select="concat('DEPARTMENT', $padding)" />

<xsl:template match="/">
    <xsl:value-of select="$ID"/><xsl:value-of select="$comma"/>
    <xsl:value-of select="$NAME"/><xsl:value-of select="$comma"/>
    <xsl:value-of select="$DEPT"/><xsl:value-of select="$comma"/>

    <xsl:for-each select="/Report_Data/Report_Entry">
    <xsl:value-of select="translate(substring(concat(company_id, $padding), 1, string-length($ID)), ',', ' ')" /><xsl:value-of select="$comma"/>

    <xsl:call-template name="company_name">
        <xsl:with-param name="id_number" select="company_id"></xsl:with-param>
</xsl:call-template>

    <xsl:value-of select="translate(substring(concat(dept, $padding), 1, string-length($DEPT)), ',', ' ')" /><xsl:value-of select="$comma"/>
</xsl:for-each>

</xsl:template>

<xsl:template name="company_name" match="/wd:Report_Data/wd:Company_Data">
<xsl:param name="id_number"></xsl:param>
<xsl:for-each select="/wd:Report_Entry">
    <xsl:if test="contains($id_number, code)">
        <xsl:value-of select="/name/text()"/>
    </xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我的輸出如下所示:

1, TestDept

代替:

1, Test1, TestDept

它不輸出name節點的值。 我怎樣才能顯示它的價值?

如果需要更多信息,我可以添加東西。

我無法添加評論以要求澄清您期望准確輸出的內容,但有一些觀察結果:

當前,您的樣式表將遍歷每個company_id元素,並且找到的每個樣式表將遍歷每個Company_Data / Report_Entry元素。 您會看到N / A,因為它會為每個company_id檢查每個單獨的Company_Data / Report_Entry,並為與當前company_id不匹配的任何內容輸出N / A。 在我看來,您只需要刪除else(在這種情況下,您無需選擇,只需一個if)。 請注意,當我嘗試運行樣式表時,得到的是001,Test1,N / A ,, Test1,N / A,與您的略有不同(但是我必須添加一個缺少的for-each結束標記)。

就代碼和名稱元素而言,由於您處於for循環中,因此焦點已轉移到要循環的元素(Report_Data / Company_Data / Report_Entry),因此您可以使用將從該循環的元素導航的相對路徑。 因此,您可以只使用“代碼”或“名稱”。 您甚至不需要“ ./”,因為這會產生相同的結果。

您無需在此處使用內部xsl:for-each循環來查找公司名稱。 您可以在此處僅使用xsl:variable和select參數,在其中可以放置“包含”表達式

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable 
         name="company_name" 
         select="/Report_Data/Company_Data/Report_Entry[contains(current()/company_id, code)]/name" />

請注意此處使用current() ,以確保表達式使用您正在使用的當前Report_Data / Report_Entry元素的company_id ,而不是您在表達式中搜索的Company_Data / Report_Entry 如果要執行當前正在執行的操作,即/Report_Data/Report_Entry/company_id ,那么這是一個“絕對”表達式,它從頂級文檔節點開始,並且始終會返回XML中的第一個company_id

但是無論如何,您都可以簡單地輸出該變量,或者使用xsl:choose輸出'NA'來代替,如果變量為空(即未找到公司名稱)。

不是因為id不匹配,通常使用鍵可以更好地處理值的查找。 要通過其代碼查找Report_Entry,您需要定義一個鍵,如下所示

<xsl:key name="company" match="Company_Data/Report_Entry" use="code" />

然后要查找它,您可以執行以下操作...

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', company_id)" />

當然,在這種情況下這將失敗,因為id並不完全相同,但是也許您可以刪除前導零。 試試這個吧。

<xsl:for-each select="Report_Data/Report_Entry">
    <xsl:variable name="company_name" select="key('company', number(company_id))" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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