2013-12-11 4 views
1

Я работаю над xslt для обработки исправлений сообщений (мне уже немного помогло это.) Я пытаюсь сохранить все поля, на которые ссылались Различные пути. Мой XSLT не справляется с этим, хотя мне очень сложно понять, почему. У меня есть сокращение xslt, которое сохраняет поле, которое я за ним, но полный xslt этого не делает. Это может быть связано с тем, что я не понимаю, как работают переменные, но я не уверен. Я не программист xslt, поэтому считаю это довольно сложным.xslt не работает как ожидалось, переменная совпадения

Пример XML-файл

<fix> 
<messages> 
    <message name="TheReport" > 
     <component name="OuterComp" required="N" /> 
    </message> 
</messages> 
<components> 
    <component name="OuterComp"> 
     <field name="AppID" required="N" /> 
     <component name="InnerComp" required="N" /> 
    </component> 
    <component name="InnerComp"> 
     <group name="Bah" required="N" > 
      <field name="NewField" required="N" /> 
     </group> 
    </component> 
</components> 
<fields> 
    <field number="3" name="AppID" type="STRING" /> 
    <field number="15" name="Bah" type="STRING" /> 
    <field number="16" name="NewField" type="STRING" /> 
</fields> 
</fix> 

'правильно' (так как в нем удается сохранить поле ПАГ), полученный вывода XML

<?xml version="1.0" encoding="UTF-8"?> 
<fix> 
<messages> 
    <message name="TheReport"> 
     <component name="OuterComp" required="N" /> 
    </message> 
</messages> 
<components> 
    <component name="OuterComp"> 
     <field name="AppID" required="N" /> 
     <component name="InnerComp" required="N" /> 
    </component> 
    <component name="InnerComp"> 
     <group name="Bah" required="N"> 
      <field name="NewField" required="N" /> 
     </group> 
    </component> 
</components> 
<fields> 
    <field number="15" name="Bah" type="STRING" /> 
</fields> 
</fix> 

вырубленных XSLT, что делает работу

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 

<xsl:output method="xml" indent="yes" /> 
<xsl:strip-space elements="*"/> 
<xsl:key name="mf" match="message/field" use="@name" /> 
<xsl:key name="cg" match="component/group" use="@name" /> 
<xsl:key name="cc" match="component/component" use="@name" /> 
<xsl:key name="mc" match="message/component" use="@name" /> 


<xsl:template match="@*|node()" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="fields/field[not(key('mf', @name))]"> 
    <xsl:variable name="IsUsed"> 
     <xsl:apply-templates select="key('cg', @name)" mode="IsUsed" /> 
    </xsl:variable> 
    <xsl:if test="$IsUsed != ''"> 
     <xsl:call-template name="identity" /> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="component/group[not(key('mc', ../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('cc', ../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="component/group[key('mc', ../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<xsl:template match="component/component[not(key('mc', ../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('mc', ../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="component/component[key('mc', ../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

и полный, что не

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 

<xsl:output method="xml" indent="yes" /> 
<xsl:strip-space elements="*"/> 
<xsl:key name="mc" match="message/component" use="@name" /> 
<xsl:key name="c2" match="group/component" use="@name" /> 
<xsl:key name="cc" match="component/component" use="@name" /> 

<xsl:key name="mf" match="message/field" use="@name" /> 
<xsl:key name="c4" match="group/field" use="@name" /> 
<xsl:key name="c5" match="group" use="@name" /> 
<xsl:key name="c7" match="component/field" use="@name" /> 
<xsl:key name="cg" match="component/group" use="@name" /> 

<xsl:template match="@*|node()" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="fields/field[not(key('mf', @name))]"> 
    <xsl:variable name="IsUsed"> 

     <xsl:apply-templates select="key('c4', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('c7', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('c5', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('c2', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('cc', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('cg', @name)" mode="IsUsed" /> 
    </xsl:variable> 
    <xsl:if test="$IsUsed != ''"> 
     <xsl:call-template name="identity" /> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="group/field[not(key('mc', ../../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', ../../@name)" mode="IsUsed"/> 
    <xsl:apply-templates select="key('cc', ../../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="group/field[key('mc', ../../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<xsl:template match="component/field[not(key('mc', ../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', ../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="component/field[key('mc', ../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<xsl:template match="component/group[not(key('mc', ../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', ../@name)" mode="IsUsed"/> 
    <xsl:apply-templates select="key('cc', ../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="component/group[key('mc', ../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<!-- <xsl:template match="component[not(key('mc', @name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', @name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="component[key('mc', @name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> --> 

<xsl:template match="group[not(key('mc', ../@name))]" mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', ../@name)" mode="IsUsed"/> 
</xsl:template> 

<xsl:template match="group[key('mc', ../@name)]" mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<xsl:template match="components/component[not(key('mc', @name))]"> 
    <xsl:variable name="IsUsed"> 
     <xsl:apply-templates select="key('cc', @name)" mode="IsUsed" /> 
     <xsl:apply-templates select="key('c2', @name)" mode="IsUsed" /> 

    </xsl:variable> 
    <xsl:if test="$IsUsed != ''"> 
     <xsl:call-template name="identity" /> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="group/component[not(key('mc', ../../@name))]" 
    mode="IsUsed"> 
    <xsl:apply-templates select="key('c2', ../../@name)" 
     mode="IsUsed" /> 
</xsl:template> 

<xsl:template match="group/component[key('mc', ../../@name)]" 
    mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

<xsl:template match="component/component[not(key('mc', ../@name))]" 
    mode="IsUsed"> 
    <!-- used to be cc --> 
    <xsl:apply-templates select="key('mc', ../@name)" 
     mode="IsUsed" /> 
</xsl:template> 

<xsl:template match="component/component[key('mc', ../@name)]" 
    mode="IsUsed"> 
    <xsl:text>1</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

Могу ли я помочь в разработке того, что происходит не так?

Спасибо.

+2

Удалось решить, как использовать отладчик eclipse xslt и отсортировать эту проблему. Я проследил маршрут, которого я не ожидал. – user1417230

+2

Возможно, стоит добавить ответ, чтобы описать, что вы сделали. Самообучаться на самом деле поощряется здесь, настолько, что вы даже получаете хорошую награду за это. –

ответ

0

Удалось решить, как использовать отладчик Eclipse XSLT и отсортировать эту проблему. Был маршрут, которого я не ожидал.