2017-02-14 31 views
0

我創建了一個XSL文件,其中包含要在xml上執行的常見變換。該文件將包含在其他幾個XSL文件中,然後這些文件將在這些常用規則之上添加更多模板。我遇到的問題是,我想匹配一個將由模板共同創建的元素,但沒有保證,它將在更具體的xsl需要匹配它時創建。 XSL:xsl:匹配來自另一個xsl文件的新創建的元素

共stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.standards.org/Intake" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> <!-- xs namespace allows typed functions and parameters --> 
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*" /> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*|text()|comment()|processing-instruction()"> 
    <xsl:copy /> 
</xsl:template> 

<!-- remove root --> 
<xsl:template match="/*"> 
    <xsl:apply-templates select="node()" /> 
</xsl:template> 

<xsl:template match="OccurrenceData"> 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="custom_Occurrence"> 
      <!-- template adds 2 more elements to custom_Occurrence, omitted for brevity --> 
      <xsl:call-template name="createOccurrenceContent" /> 
     </xsl:element> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 
<!-- rest of stylesheet --> 
</xsl:stylesheet> 

第一特定stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:import href="common-stylesheet.xsl" /> 
<xsl:template match="custom_Occurrence"> 
    <xsl:element name="{local-name()}"> 
     <xsl:element name="custom_TestElement"/> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 
<!-- rest of stylesheet --> 
</xsl:stylesheet> 

我通過一特定的樣式表發送以下輸入XML:

input.xml

<Request> 
    <RequestData> 
     <Occurrence> 
      <OccurrenceCd>EJ104</OccurrenceCd> 
      <!-- more children --> 
     </Occurrence> 
     <!-- rest of input--> 
    </RequestData> 
</Request> 

而且結果應該如下所示:

所需-的Output.xml

<RequestData> 
    <Occurrence> 
     <OccurrenceCd>EJ104</Occurrence> 
     <custom_Occurrence> 
      <custom_TestElement /> 
     </custom_Occurrence> 
     <!--more children --> 
    </Occurrence> 
    <!-- rest of output --> 
</RequestData> 

在分鐘,常見的模板跑去他們的工作預期,但<custom_TestElement><custom_Occurrence>中缺失。是否有辦法將通用文件包含到它們中以獲取特定的xsl文件,並確保在更具體的文件開始匹配新元素之前運行常用文件模板?這可能在一個文件中,或者我必須將轉換分成他們自己的步驟,即先運行通用轉換,然後將xml傳遞到更具體的xml中?

注意:我正在使用<xsl:element name="{local-name()}">和帶有額外模板格式的經過調整的身份轉換,因爲源xml沒有名稱空間,我正在將其中一個應用於常用的xsl;如果沒有這些名稱空間,則將該名稱空間應用於每個元素,或者使用空值或使用完整值。另外,我正在使用Saxon-HE v9.7.0-8進行轉換

編輯:我無法將custom_OCCurrence的創建移動到更具體的樣式表;該元素塊及其內容在所有特定樣式表之間共享,每個元素塊和值將添加到該元素「塊」(取決於使用哪一個)

回答

1

您需要使用變量如

<xsl:variable name="temp"> 
     <xsl:element name="custom_Occurrence"> 
      <!-- template adds 2 more elements to custom_Occurrence, omitted for brevity --> 
      <xsl:call-template name="createOccurrenceContent" /> 
     </xsl:element> 
</xsl:variable> 

<xsl:apply-templates select="$temp/node()"/> 

如果您想將模板應用到您的XSLT創建的節點。

+0

林不知道我明白。因此,創建一個共同的變量並將其稱爲共同點? – jbailie1991

+0

而不是' ...'您需要將我在回答中顯示的代碼放在首位,然後處理,沒有新創建的節點被模板匹配的魔力,所以您要麼需要使用變量,要麼確實需要處理步驟。 –

+0

這完全忽略了custom_Occurrence元素,假設我正確地遵循了這種方法,您是否能夠擴展上下文的代碼片段? – jbailie1991