2013-09-22 3 views
0

С помощью Тима из моего предыдущего сообщения я смог получить группу Muenchian, работающую для моего теста xml/xsl. Но при работе с моим фактическим xml я столкнулся с другим сценарием, как показано ниже. Ввод xml выглядит, уменьшен для простоты. Как вы видите <name>Status</name> <value>Existing</value>, в текущем xml есть много других записей.Muenchian Grouping - отображает базу второго уровня по количеству строк

<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-значения элементов

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-».