2013-09-22 16 views
0

在我之前發佈的Tim的幫助下,我能夠獲得Muenchian分組爲我的測試xml/xsl工作。但是,在處理我的實際XML時,我遇到了與下面不同的場景。輸入xml看起來像,簡化了它。正如你看到<name>Status</name> <value>Existing</value>在實際的xml中有很多其他的條目。Muenchian分組 - 根據行數顯示二級基地

<message> 
<requisition> 
<data-values> 
    <data-value multi-valued="false"> 
     <name>Test_Grid-1.Name</name> <value>1</value> 
    </data-value> 
    <data-value multi-valued="false"> 
     <name>Test_Grid-1.SupportType</name> <value>Monthly,Quarterly</value> 
    </data-value> 
    <data-value multi-valued="false"> 
     <name>Test_Grid-2.Name</name> <value>2</value> 
    </data-value> 
    <data-value multi-valued="false"> 
     <name>Test_Grid-2.SupportType</name> <value>Monthly</value> 
    </data-value> 
    <data-value multi-valued="false"> 
     <name>Status</name> <value>Existing</value> 
    </data-value> 
</data-values> 
</requisition> 
<agent-parameter multi-valued="false"> 
    <name>ActionType</name> <value>New</value> 
</agent-parameter> 
<agent-parameter multi-valued="false"> 
    <name>Dictionary</name> <value>Test_Grid</value> 
</agent-parameter> 
<agent-parameter multi-valued="false"> 
    <name>ActionName</name> <value>SupportData</value> 
</agent-parameter> 
</message> 

我使用的XSL是:

<xsl:key name="record" match="data-value" use="substring-before(name, '.')" /> 

<xsl:template match="message"> 
    <record> 
    <xsl:apply-templates select="//data-value[generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" mode="record" /> 
    </record> 
</xsl:template> 
<xsl:template match="data-value" mode="record"> 
<rowData> 
    <name><xsl:value-of select="$ServiceItemName" /></name> 
<xsl:apply-templates select="key('record', substring-before(name, '.'))" /> 
</rowData> 
</xsl:template> 

<xsl:template match="data-value"> 
<xsl:if test="starts-with(name,concat($Dictionary,'-'))"> 
    <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" /> </rowAttribute> 
</xsl:if> 
</xsl:template> 

實際輸入XML包含不同的數據值(比其他Test_Grid-1或Test_Grid-2等)。在這種情況下,xsl會拉動所有這些元素並顯示在裏面。有沒有什麼辦法可以過濾僅以「Test_Grid-」開頭的值(我的代理參數名稱爲Dictionary,值爲「Test_Grid」),並且xsl將僅提取名稱開頭的那些數據值 - concat($Dictionary,'-') 。我想類似下面

 <xsl:template match="data-value"> 
    <xsl:if test="starts-with(name,concat($Dictionary,'-'))"> 
     <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" /></rowAttribute> 
    </xsl:if> 

但它顯示類似下面的輸出空元素所需的輸出功率一起。

<record> 
      <name>SupportData</ext:name> 
</record> 
<record> 
       <name>SupportData</name> 
    <rowData> 
       <rowAttribute name="Name">Record1</rowAttribute> 
       <rowAttribute name="SupportType">Quarterly</rowAttribute> 
    </rowData>   
</record> 

有沒有一種方法可以顯示元素,只有當它有一些rowData元素。

任何和所有的幫助將非常感激。

回答

1

要忽略數據值名稱不以'Test_Grid-'開頭的元素,可以使用xpath函數'starts-with'。可以添加一個條件中的XPath表達式過濾數據值元件

data-value[starts-with(name, 'Test_Grid-')] 

實際上,你可以將其添加到的xsl:鍵匹配上數據值,或到XSL :apply-templates您可以在其中選擇它們。例如,你可以做這一點:

<xsl:key name="record" match="data-value[starts-with(name, 'Test_Grid-')]" use="substring-before(name, '.')" /> 

或者,你可以這樣做

<xsl:apply-templates 
    select="requisition/data-values/data-value 
     [starts-with(name, 'Test_Grid-')] 
     [generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" 
    mode="record" /> 

它可能是更有效地把它作爲關鍵的一部分。通過將它作爲關鍵字的一部分,對不同元素的檢查將只考慮以'Test-Grid-'開頭的元素。