站点地图作为文件夹结构
嘿伙计们, 我正在寻找一种将站点地图显示为文件夹结构的方法。
因此,目前站点地图如下所示:
- http://mydomain.com/
- http://mydomain.com/category
- http:// /mydomain.com/category/product1
- http://mydomain.com/category/product2
- http://mydomain.com/other-category/product1
- http://mydomain.com/other-category/product2
但是,我正在寻找这个:
- http://mydomain.com/
- 类别
- 产品1
- 产品2
- 其他类别
- 产品1
- 产品2
- 类别
有没有方便的方法来做到这一点?
站点地图代码
...
<url>
<loc>http://mydomain.com</loc>
<changefreq>weekly</changefreq>
<priority>1.00</priority>
</url>
<url>
<loc>http://mydomain.com/category</loc>
<changefreq>weekly</changefreq>
<priority>0.80</priority>
</url>
...
** XSLT 代码 **
...
<ul>
<xsl:for-each select="xna:urlset/xna:url">
<li><xsl:value-of select="xna:loc"/></li>
</xsl:for-each>
</ul>
...
Hey guys,
I'm looking for a way to show a sitemap as a folder structure.
So currently the sitemap looks like this:
- http://mydomain.com/
- http://mydomain.com/category
- http://mydomain.com/category/product1
- http://mydomain.com/category/product2
- http://mydomain.com/other-category/product1
- http://mydomain.com/other-category/product2
But instead, I'm looking for this:
- http://mydomain.com/
- category
- product1
- product2
- other-category
- product1
- product2
- category
Is there a convenient way to do this?
Sitemap code
...
<url>
<loc>http://mydomain.com</loc>
<changefreq>weekly</changefreq>
<priority>1.00</priority>
</url>
<url>
<loc>http://mydomain.com/category</loc>
<changefreq>weekly</changefreq>
<priority>0.80</priority>
</url>
...
** XSLT Code **
...
<ul>
<xsl:for-each select="xna:urlset/xna:url">
<li><xsl:value-of select="xna:loc"/></li>
</xsl:for-each>
</ul>
...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我。此 XSLT 1.0 解决方案:
当应用于以下 XML 文档时(基于提供的片段):
产生所需的正确结果:
--
在浏览器中看起来像这样:
站点地图
3 说明:
站点地图包含不同的域,其中包含不同的类别,并且包含不同的产品。
站点
这是一个两遍解决方案。
第一遍标记每个 URL。标记由
word
元素表示。第二遍适用于第一遍 Muenchian 分组对包含一个、然后是两个、然后三个部分的键的结果。
二. XSLT 2.0 解决方案
说明:
我们使用许多有助于分组的 XSLT 2.0 功能:
< /p>current-group()
I. This XSLT 1.0 solution:
when applied on the following XML document (based on the provided fragment):
produces the wanted, correct result:
--
and it looks like this in the browser:
Sitemap
Explanation:
The site map gropus different domains, inside them different categories and inside them different products.
This is a two-pass solution.
The first pass tokenizes each url. The tokens are represented by
word
elements.The second pass applies to the results of the first pass Muenchian grouping on keys containing one, then two, then three parts.
II. XSLT 2.0 solution
Explanation:
We use a number of XSLT 2.0 features that facilitate grouping:
<xsl:for-each-group>
current-group()
在此 1.0 转换类别中,仅使用
substring-before
和substring-after
来收集。要将此转换应用于您的案例,您只需在
xsl:param
和xsl:key
中设置真实域。请注意,您的输入 xml 是一个片段,不清楚您需要如何管理命名空间前缀。因此,我在没有命名空间的示例 XML 上测试了转换。如果源 XML 包含名称空间前缀,则应调整转换。
XSLT 1.0 在 Saxon 6.5.5 下测试
此转换应用于以下输入:
生成:
使用 XSLT 2.0 用户定义的函数,我们可以使转换更具可读性。此外,您需要在初始参数中指明您的域,因为 2.0 xsl:key 支持变量引用。
XSLT 2.0 在 Saxon-B 9.0.0.4J 下测试
In this 1.0 transform categories are gathered just by using
substring-before
andsubstring-after
.To apply this transform to your case, you simply need to set your real domain in the
xsl:param
and within thexsl:key
.Note that your input xml is a fragment and it is not clear how you need namespace prefix managed. Therefore I've tested the transform on a sample XML without namespaces. If your source XML contains namespace prefixes the transform should be tuned.
XSLT 1.0 tested under Saxon 6.5.5
This transform applied on the following input:
Produces:
Using XSLT 2.0 user-defined functions, we can make the transform yet more readable. Moreover, you will need to indicate your domain just in the initial parameters, as 2.0
xsl:key
supports variable references.XSLT 2.0 tested under Saxon-B 9.0.0.4J
这是一个简单的模板,应该可以满足您的需要:
第一个模板仅选择您的起点;在本例中,假设文档中的第一个 url 包含您的根目录。在这里使用你需要的任何xpath;
//url[loc='http://mydomain.com']
也可以。第二个模板完成这项工作,只是输出当前的 loc 字段,并使用 substring-after 去除之前的内容。然后,它将自身应用于任何其他
url
节点,这些节点的loc
字段以当前节点中的文本开头,但不包含任何其他/
字符。Here's a simple template that should do what you need:
The first template just picks your starting point; in this case assuming the first url in the document contains your root. Use whatever xpath you need here;
//url[loc='http://mydomain.com']
would also do.The second template does the work, simply outputting the current
loc
field, stripping off what came before it using substring-after. It then applies itself to any otherurl
nodes whoseloc
field starts with the text in the current one, but does not have any further/
characters.