Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xslt未按预期工作,匹配变量_Xml_Variables_Xslt_Xslt 2.0_Fix Protocol - Fatal编程技术网

Xml xslt未按预期工作,匹配变量

Xml xslt未按预期工作,匹配变量,xml,variables,xslt,xslt-2.0,fix-protocol,Xml,Variables,Xslt,Xslt 2.0,Fix Protocol,我正在研究处理修复消息的xslt,我已经在这方面得到了一些帮助。 我试图保留以各种方式引用的所有字段。但我的XSLT并没有做到这一点,我发现很难找出原因。 我有一个精简的xslt,它保留了我想要的字段,但完整的xslt没有。这可能是因为我不了解变量是如何工作的,但我不确定。我不是xslt程序员,所以我觉得这很难 示例xml文件 <fix> <messages> <message name="TheReport" > <compon

我正在研究处理修复消息的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>
中的“正确”字段设法保留bah字段生成的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> 
能帮我找出哪里出了问题吗

谢谢


设法解决了如何使用EclipseXSLT调试器并解决了这个问题。走了一条我没想到的路


设法解决了如何使用EclipseXSLT调试器并解决了这个问题。这是一条我没想到的路线。也许值得添加一个答案来描述你所做的事情。实际上,这里鼓励自我学习,以至于你甚至因为这样做而获得了一个spiffy奖。