Php 如何使用xsl按属性值对xml文件夹和文件进行排序?
首先,在xsl方面,我是个新手。 我有一个.xml文档顺序不正确 xml示例:Php 如何使用xsl按属性值对xml文件夹和文件进行排序?,php,xml,xslt,Php,Xml,Xslt,首先,在xsl方面,我是个新手。 我有一个.xml文档顺序不正确 xml示例: <folder-one order="2"> <another-folder order="2"> <some-file order="2">title</some-file> <some-file order="1">title</some-file> <some-file orde
<folder-one order="2">
<another-folder order="2">
<some-file order="2">title</some-file>
<some-file order="1">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
<another-folder order="1">
<some-file order="2">title</some-file>
<some-file order="1">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
</folder-one>
<folder-two order="1">
<another-folder order="2">
<some-file order="2">title</some-file>
<some-file order="1">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
<another-folder order="1">
<some-file order="2">title</some-file>
<some-file order="1">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
</folder-two>
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
我需要这个:
<folder-one order="1">
<another-folder order="1">
<some-file order="1">title</some-file>
<some-file order="2">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
<another-folder order="2">
<some-file order="1">title</some-file>
<some-file order="2">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
</folder-one>
<folder-two order="2">
<another-folder order="1">
<some-file order="1">title</some-file>
<some-file order="2">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
<another-folder order="2">
<some-file order="1">title</some-file>
<some-file order="2">title</some-file>
<some-file order="3">title</some-file>
</another-folder>
</folder-two>
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
标题
无论我想做什么,我都会把事情搞得一团糟,甚至无法显示结构。
我尝试过使用xsl:for-each和xsl:sort,但都没有用。可能是因为我做得不对。我不知道还能做什么
这里是已经存在的xsl。无论如何,改变它会给我带来麻烦
<xsl:stylesheet version="1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:ectd = "http://www.ich.org/ectd"
xmlns:xlink = "http://www.w3c.org/1999/xlink">
<xsl:template match="/">
<html>
<head>
<link rel="stylesheet" href="util/style/screen.css" type="text/css" media="screen"/>
</head>
<body>
<h2>eCTD <font size="-1"> DTD version <xsl:value-of select="/ectd:ectd/@dtd-version"/></font></h2>
<xsl:apply-templates select="/ectd:ectd/*"/>
</body>
</html>
</xsl:template>
<xsl:template match="*">
<ul type="square">
<li>
<xsl:value-of select="name()"/>
<font color="green">
<xsl:if test="@manufacturer != ''"> [manufacturer: <xsl:value-of select="@manufacturer"/>] </xsl:if>
<xsl:if test="@substance != ''"> [substance: <xsl:value-of select="@substance"/>] </xsl:if>
<xsl:if test="@product-name != ''"> [product name: <xsl:value-of select="@product-name"/>] </xsl:if>
<xsl:if test="@dosageform != ''"> [dosage form: <xsl:value-of select="@dosageform"/>] </xsl:if>
<xsl:if test="@indication != ''"> [indication: <xsl:value-of select="@indication"/>] </xsl:if>
<xsl:if test="@excipient != ''"> [excipient: <xsl:value-of select="@excipient"/>] </xsl:if>
</font>
</li>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="leaf">
<ul type="square">
<li>
<xsl:element name="a">
<xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
<xsl:value-of select="title"/>
</xsl:element>
<font color="red">
[<xsl:value-of select="@operation"/>]
</font>
</li>
</ul>
</xsl:template>
<xsl:template match="node-extension">
<ul type="square">
<li>
<xsl:value-of select="title"/>
<xsl:apply-templates select="leaf|node-extension"/>
</li>
</ul>
</xsl:template>
eCTD DTD版本
-
[制造商:]
[实质内容:]
[产品名称:]
[剂型:]
[说明:]
[赋形剂:]
-
[]
-
在我的示例中,“leaf”是“some file”…您只需向著名的
请注意,您的XML示例不是格式良好的文档:您缺少一个根元素。您能告诉我们您尝试了什么吗?实际XML输入中的元素是否真的命名为“文件夹一”和“文件夹二”,或“文件夹二”两者?不,它们没有命名为文件夹一、文件夹二。。。实际上,我正在扫描文档,并获取用户使用的文件夹名称和文件。在这里,我添加了xsl文件,这让我为您的答案感到困扰。我试试看。这只是my.xml的中间部分(示例)。它有一个根元素,可以工作,但不幸的是,它与已经存在的xsl冲突,这太糟糕了;不幸的是,我的水晶球在洗衣店。我的猜测是,您需要将sort指令添加到一个(或多个)apply templates元素中,方式与上面我的模板中所示的相同。为了确保这一点,我必须重新编写您的XML以匹配XSLT(或者相反),而这不是我要做的事情。当然,我不希望您这样做:)非常感谢您的帮助。我希望我能给你竖起大拇指,但我是新来的,所以我不能。很抱歉
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@order" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>