Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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_Xslt_Xpath - Fatal编程技术网

Xml 需要帮助修复XSLT文档吗

Xml 需要帮助修复XSLT文档吗,xml,xslt,xpath,Xml,Xslt,Xpath,以下代码有两个问题需要帮助解决: 1) 从XPath表达式返回结果时,它不包括根节点。(我试过几次,但结果更糟……) 2) 我需要帮助修复结果的格式。我需要在一个标题下列出具有相同属性的相同节点,而不是每个结果都有一个标题。我之前有一个,但是现在代码的问题已经解决了,我似乎无法在不影响结果的情况下让标题正常工作 除了缺少根节点的问题之外,我相信这会返回正确的结果,因此我不想彻底更改代码 下面是我正在测试的一些故意不一致的虚拟XML: <pets name="myPets" NUM="2"&

以下代码有两个问题需要帮助解决:

1) 从XPath表达式返回结果时,它不包括根节点。(我试过几次,但结果更糟……)

2) 我需要帮助修复结果的格式。我需要在一个标题下列出具有相同属性的相同节点,而不是每个结果都有一个标题。我之前有一个,但是现在代码的问题已经解决了,我似乎无法在不影响结果的情况下让标题正常工作

除了缺少根节点的问题之外,我相信这会返回正确的结果,因此我不想彻底更改代码

下面是我正在测试的一些故意不一致的虚拟XML:

<pets name="myPets" NUM="2">
    <dog name="allMyDogs" NUM="5">
        <dog name="Frank" cute="yes" color"brown" type="Lab" NUM="3"/>
        <dog name="Frank" NUM="3"/>
        <dog name="Spot"  NUM="4"/>
        <dog name="Rover" cute="yes" NUM="1"/>
        <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/>
        <cat name="Lucy" cute="yes" NUM="4"/>
    </dog>
    <cat name="allMyCats" NUM="4">
        <cat name="Simba" cute="yes" NUM="4"/>
        <cat name="Princess" cute="no" color="black" NUM="5"/>
        <cat name="Fluffy" cute="yes" color="grey" NUM="1"/>
        <cat name="Lucy" cute="yes" color="brown" NUM="3">
            <cat name="Lucy" cute="no"  NUM="35"/>
            <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/>
        </cat>
        <cat name="Lucy"cute="no" color="grey" NUM="1"/>
        <dog name="Rover" cute="yes" NUM="24"/>
    </cat>
    <cat name="Lucy" NUM="9"/>
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/>
</pets>

谢谢!:)如果我需要清理任何东西,请告诉我

此转换修复了所有提到的问题:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes="msxsl">

    <xsl:key name="elem_key" match="elem" use="." />

    <xsl:key name="elem_key2" match="elem"
     use="concat(@key, @name, .)" />

    <xsl:variable name="all_data">
        <xsl:apply-templates select="//*[@NUM&lt;=4]">
            <xsl:sort select="name()" />
        </xsl:apply-templates>
    </xsl:variable>

    <xsl:template match="*">
        <elem key="{name()}">
            <xsl:copy-of select="@*" />
            <xsl:for-each select="@*">
                <xsl:sort select="name()" />
                <attribute>|<xsl:value-of select="name()" />|</attribute>
            </xsl:for-each>
        </elem>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="msxsl:node-set($all_data)">
                    <xsl:for-each select=
                    "*[generate-id()
                      =
                      generate-id(key('elem_key',.)[1])
                      ]">
                        <table >
                            <tr>
                                <td>Element Name</td>
                                <xsl:for-each select="*">
                                    <td>
                                        <xsl:value-of select=
                                            "translate(.,'|','')" />
                                    </td>
                                </xsl:for-each>
                            </tr>
                            <xsl:for-each select="key('elem_key',.)">
                              <xsl:variable name="curr_elem" select="." />
                                <tr>
                                    <td>
                                        <xsl:value-of select="@key" />
                                    </td>
                                    <xsl:for-each select="*">
                                        <td >
                                            <xsl:value-of select=
                                          "$curr_elem/@*
                                               [name()
                                               =
                                                translate(current(),
                                                         '|',
                                                         ''
                                                         )
                                               ]" />
                                        </td>
                                    </xsl:for-each>
                                </tr>
                            </xsl:for-each>
                        </table>
                        <p />
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
<pets name="myPets" NUM="2">
    <dog name="allMyDogs" NUM="5">
        <dog name="Frank" cute="yes" color="brown" type="Lab" NUM="3"/>
        <dog name="Frank" NUM="3"/>
        <dog name="Spot"  NUM="4"/>
        <dog name="Rover" cute="yes" NUM="1"/>
        <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/>
        <cat name="Lucy" cute="yes" NUM="4"/>
    </dog>
    <cat name="allMyCats" NUM="4">
        <cat name="Simba" cute="yes" NUM="4"/>
        <cat name="Princess" cute="no" color="black" NUM="5"/>
        <cat name="Fluffy" cute="yes" color="grey" NUM="1"/>
        <cat name="Lucy" cute="yes" color="brown" NUM="3">
            <cat name="Lucy" cute="no"  NUM="35"/>
            <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/>
        </cat>
        <cat name="Lucy" cute="no" color="grey" NUM="1"/>
        <dog name="Rover" cute="yes" NUM="24"/>
    </cat>
    <cat name="Lucy" NUM="9"/>
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/>
</pets>
<html>
    <body>
        <table>
            <tr>
                <td>Element Name</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>4</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Simba</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>yes</td>
                <td>Rover</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>allMyCats</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Frank</td>
                <td>3</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Spot</td>
                <td>4</td>
            </tr>
            <tr>
                <td>pets</td>
                <td>myPets</td>
                <td>2</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>yes</td>
                <td>Fluffy</td>
                <td>1</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>brown</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>3</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>no</td>
                <td>Lucy</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
                <td>type</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>brown</td>
                <td>yes</td>
                <td>Frank</td>
                <td>3</td>
                <td>Lab</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>black</td>
                <td>yes</td>
                <td>Rupert Jr</td>
                <td>0</td>
                <td>Pug</td>
            </tr>
        </table>
        <p></p>
    </body>
</html>

||
元素名

当此转换应用于提供的XML文档时

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes="msxsl">

    <xsl:key name="elem_key" match="elem" use="." />

    <xsl:key name="elem_key2" match="elem"
     use="concat(@key, @name, .)" />

    <xsl:variable name="all_data">
        <xsl:apply-templates select="//*[@NUM&lt;=4]">
            <xsl:sort select="name()" />
        </xsl:apply-templates>
    </xsl:variable>

    <xsl:template match="*">
        <elem key="{name()}">
            <xsl:copy-of select="@*" />
            <xsl:for-each select="@*">
                <xsl:sort select="name()" />
                <attribute>|<xsl:value-of select="name()" />|</attribute>
            </xsl:for-each>
        </elem>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="msxsl:node-set($all_data)">
                    <xsl:for-each select=
                    "*[generate-id()
                      =
                      generate-id(key('elem_key',.)[1])
                      ]">
                        <table >
                            <tr>
                                <td>Element Name</td>
                                <xsl:for-each select="*">
                                    <td>
                                        <xsl:value-of select=
                                            "translate(.,'|','')" />
                                    </td>
                                </xsl:for-each>
                            </tr>
                            <xsl:for-each select="key('elem_key',.)">
                              <xsl:variable name="curr_elem" select="." />
                                <tr>
                                    <td>
                                        <xsl:value-of select="@key" />
                                    </td>
                                    <xsl:for-each select="*">
                                        <td >
                                            <xsl:value-of select=
                                          "$curr_elem/@*
                                               [name()
                                               =
                                                translate(current(),
                                                         '|',
                                                         ''
                                                         )
                                               ]" />
                                        </td>
                                    </xsl:for-each>
                                </tr>
                            </xsl:for-each>
                        </table>
                        <p />
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
<pets name="myPets" NUM="2">
    <dog name="allMyDogs" NUM="5">
        <dog name="Frank" cute="yes" color="brown" type="Lab" NUM="3"/>
        <dog name="Frank" NUM="3"/>
        <dog name="Spot"  NUM="4"/>
        <dog name="Rover" cute="yes" NUM="1"/>
        <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/>
        <cat name="Lucy" cute="yes" NUM="4"/>
    </dog>
    <cat name="allMyCats" NUM="4">
        <cat name="Simba" cute="yes" NUM="4"/>
        <cat name="Princess" cute="no" color="black" NUM="5"/>
        <cat name="Fluffy" cute="yes" color="grey" NUM="1"/>
        <cat name="Lucy" cute="yes" color="brown" NUM="3">
            <cat name="Lucy" cute="no"  NUM="35"/>
            <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/>
        </cat>
        <cat name="Lucy" cute="no" color="grey" NUM="1"/>
        <dog name="Rover" cute="yes" NUM="24"/>
    </cat>
    <cat name="Lucy" NUM="9"/>
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/>
</pets>
<html>
    <body>
        <table>
            <tr>
                <td>Element Name</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>4</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Simba</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>yes</td>
                <td>Rover</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>allMyCats</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Frank</td>
                <td>3</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Spot</td>
                <td>4</td>
            </tr>
            <tr>
                <td>pets</td>
                <td>myPets</td>
                <td>2</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>yes</td>
                <td>Fluffy</td>
                <td>1</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>brown</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>3</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>no</td>
                <td>Lucy</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
                <td>type</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>brown</td>
                <td>yes</td>
                <td>Frank</td>
                <td>3</td>
                <td>Lab</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>black</td>
                <td>yes</td>
                <td>Rupert Jr</td>
                <td>0</td>
                <td>Pug</td>
            </tr>
        </table>
        <p></p>
    </body>
</html>

产生所需结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes="msxsl">

    <xsl:key name="elem_key" match="elem" use="." />

    <xsl:key name="elem_key2" match="elem"
     use="concat(@key, @name, .)" />

    <xsl:variable name="all_data">
        <xsl:apply-templates select="//*[@NUM&lt;=4]">
            <xsl:sort select="name()" />
        </xsl:apply-templates>
    </xsl:variable>

    <xsl:template match="*">
        <elem key="{name()}">
            <xsl:copy-of select="@*" />
            <xsl:for-each select="@*">
                <xsl:sort select="name()" />
                <attribute>|<xsl:value-of select="name()" />|</attribute>
            </xsl:for-each>
        </elem>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="msxsl:node-set($all_data)">
                    <xsl:for-each select=
                    "*[generate-id()
                      =
                      generate-id(key('elem_key',.)[1])
                      ]">
                        <table >
                            <tr>
                                <td>Element Name</td>
                                <xsl:for-each select="*">
                                    <td>
                                        <xsl:value-of select=
                                            "translate(.,'|','')" />
                                    </td>
                                </xsl:for-each>
                            </tr>
                            <xsl:for-each select="key('elem_key',.)">
                              <xsl:variable name="curr_elem" select="." />
                                <tr>
                                    <td>
                                        <xsl:value-of select="@key" />
                                    </td>
                                    <xsl:for-each select="*">
                                        <td >
                                            <xsl:value-of select=
                                          "$curr_elem/@*
                                               [name()
                                               =
                                                translate(current(),
                                                         '|',
                                                         ''
                                                         )
                                               ]" />
                                        </td>
                                    </xsl:for-each>
                                </tr>
                            </xsl:for-each>
                        </table>
                        <p />
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
<pets name="myPets" NUM="2">
    <dog name="allMyDogs" NUM="5">
        <dog name="Frank" cute="yes" color="brown" type="Lab" NUM="3"/>
        <dog name="Frank" NUM="3"/>
        <dog name="Spot"  NUM="4"/>
        <dog name="Rover" cute="yes" NUM="1"/>
        <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/>
        <cat name="Lucy" cute="yes" NUM="4"/>
    </dog>
    <cat name="allMyCats" NUM="4">
        <cat name="Simba" cute="yes" NUM="4"/>
        <cat name="Princess" cute="no" color="black" NUM="5"/>
        <cat name="Fluffy" cute="yes" color="grey" NUM="1"/>
        <cat name="Lucy" cute="yes" color="brown" NUM="3">
            <cat name="Lucy" cute="no"  NUM="35"/>
            <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/>
        </cat>
        <cat name="Lucy" cute="no" color="grey" NUM="1"/>
        <dog name="Rover" cute="yes" NUM="24"/>
    </cat>
    <cat name="Lucy" NUM="9"/>
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/>
</pets>
<html>
    <body>
        <table>
            <tr>
                <td>Element Name</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>4</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>yes</td>
                <td>Simba</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>yes</td>
                <td>Rover</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>allMyCats</td>
                <td>4</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Frank</td>
                <td>3</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>Spot</td>
                <td>4</td>
            </tr>
            <tr>
                <td>pets</td>
                <td>myPets</td>
                <td>2</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>yes</td>
                <td>Fluffy</td>
                <td>1</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>brown</td>
                <td>yes</td>
                <td>Lucy</td>
                <td>3</td>
            </tr>
            <tr>
                <td>cat</td>
                <td>grey</td>
                <td>no</td>
                <td>Lucy</td>
                <td>1</td>
            </tr>
        </table>
        <p></p>
        <table>
            <tr>
                <td>Element Name</td>
                <td>color</td>
                <td>cute</td>
                <td>name</td>
                <td>NUM</td>
                <td>type</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>brown</td>
                <td>yes</td>
                <td>Frank</td>
                <td>3</td>
                <td>Lab</td>
            </tr>
            <tr>
                <td>dog</td>
                <td>black</td>
                <td>yes</td>
                <td>Rupert Jr</td>
                <td>0</td>
                <td>Pug</td>
            </tr>
        </table>
        <p></p>
    </body>
</html>

元素名
可爱的
名称
全国矿工联盟
猫
对
露西
4.
猫
对
辛巴
4.
狗
对
罗孚
1.

元素名 名称 全国矿工联盟 猫 所有我的猫 4. 狗 直率的 3. 狗 斑点 4. 宠物 我的宠物 2.

元素名 颜色 可爱的 名称 全国矿工联盟 猫 灰色 对 毛茸茸的 1. 猫 棕色的 对 露西 3. 猫 灰色 不 露西 1.

元素名 颜色 可爱的 名称 全国矿工联盟 类型 狗 棕色的 对 直率的 3. 实验室 狗 黑色 对 小鲁珀特 0 帕格


您忘了提供转换所需的确切输出。求求你了。@Dimitre:谢谢你指出这一点。已更新所需输出。我认为我的答案现在包含您需要的解决方案(+1)。:)@迪米特:嗯。。我认为结果是重复的。我认为应该只有12个结果。哦,最初我希望在不同的标题下有不同的节点(猫对狗),但我想我可能不介意您如何显示它(更简洁)-我只需要确保它按元素名称排序。@Dimitre:+1了解您从这个项目中得到的所有答案。啊@谢谢你注意到这一点。我现在已经解决了最后一个问题,而转换现在产生的正是想要的结果。@Dimitre:说这个我感觉很糟糕,但我认为它仍然缺少一个。它似乎没有从最深层的层次结构中恢复过来。。你知道我的意思吗?很抱歉,我一直在为这个问题大惊小怪:(我只是在XSL和XPath方面不够好,无法识别需要修复的内容。@Dimitre:再一次,您好,您认为您知道如何修复我注意到的最后一个错误吗?我很忙,如果不知道,我可能不得不开始悬赏其他人来回答……但我不想“花费”我所有的观点。:(让我知道!谢谢:)