2013-12-11 2 views
1

수정 메시지를 처리하기 위해 xslt에서 작업하고 있습니다. (이미이 문제를 해결했습니다.) 참조 된 모든 필드를 유지하려고합니다. 다양한 방법. 내 XSLT는이 일을 처리하지 못하고 있으며 이유를 찾기가 매우 힘들다. 나는 필드를 유지하는 xslt를 줄 였지만 전체 xslt는 유지하지 않습니다. 이것은 변수가 작동하는 방식에 대한 나의 이해가 부족하기 때문일 수 있지만 확실하지는 않습니다. 나는 xslt 프로그래머가 아니기 때문에 이것을 매우 어렵게 생각하고있다. XML 출력을 생성 (는 바하 필드를 유지하기 위해 관리와 같이) 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 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 디버거 사용법을 관리하고이 문제를 분류했습니다. 내가 예상하지 못한 길을 택하고 있었다.

관련 문제