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>
我可以在制定出什麼問題時有一些幫助嗎?
謝謝。
管理如何使用eclipse xslt調試器並對此問題進行排序。正在兜售一條我沒想到的路線。 – user1417230
可能值得添加一個答案來描述你做了什麼。自我學習實際上在這裏受到鼓勵,以至於你甚至可以因爲這樣做而獲得一個漂亮的獎勵。 – 2013-12-11 22:36:23