没有子项的 xslt 副本
你好 我有一个站点地图 xml 文档,看起来像这样,
<pagenode title="home" url="~/" fornavbar="true">
<pagenode title="admin" url="~/admin" fornavbar="false">
<pagenode title="users" url="~/admin/users" fornavbar="false"/>
<pagenode title="events" url="~/admin/events" fornavbar="true"/>
</pagenode>
<pagenode title="catalog" url="~/catalog" fornavbar="true"/>
<pagenode title="contact us" url="~/contactus" fornavbar="false"/>
</pagenode>
现在我想检索导航栏的 xml 文档,其中包括所有具有 fornavbar=true 的页面节点。这怎么办?
到目前为止我能得到的最接近的是:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="pagenode[@fornavbar='true']">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
这个问题是包括与导航栏匹配的任何内容的所有子项
我只想复制所有属性,而不是所有子项,
但如果我尝试
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="pagenode[@fornavbar='true']">
<pagenode title="{@title}" url="{@url}"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
有两个问题
- ,那么我 可能会单独输入每个属性,而且我每页都有很多属性,它们很容易更改,最终
- 会失去层次结构。一切都变得越来越平淡,
我将不胜感激在这件事上的所有帮助。
谢谢你!
编辑:我喜欢看到的示例输出
<pagenode title="home" url="~/" fornavbar="true">
<pagenode title="events" url="~/admin/events" fornavbar="true"/>
<pagenode title="catalog" url="~/catalog" fornavbar="true"/>
</pagenode>
hi
i have a sitemap xml document that looks something like this
<pagenode title="home" url="~/" fornavbar="true">
<pagenode title="admin" url="~/admin" fornavbar="false">
<pagenode title="users" url="~/admin/users" fornavbar="false"/>
<pagenode title="events" url="~/admin/events" fornavbar="true"/>
</pagenode>
<pagenode title="catalog" url="~/catalog" fornavbar="true"/>
<pagenode title="contact us" url="~/contactus" fornavbar="false"/>
</pagenode>
now i want to retrieve an xml document for the navbar, which includes all the pagenodes that have fornavbar=true. how can this be done?
the closest i was able to get so far was this:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="pagenode[@fornavbar='true']">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
the problem with this is that includes all the children of anything matched as navbar
i only want to copy all the attributes, not all the children
but if i try
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="pagenode[@fornavbar='true']">
<pagenode title="{@title}" url="{@url}"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
then i have 2 problems
- i might type out each attribute separately, and i have quite a few per page and theyre apt to change eventually
- it loses the hierarchy. everything becomes flat one after the other
i would appreciate all and any help in the matter.
thank you!
EDIT: sample output that id like to see
<pagenode title="home" url="~/" fornavbar="true">
<pagenode title="events" url="~/admin/events" fornavbar="true"/>
<pagenode title="catalog" url="~/catalog" fornavbar="true"/>
</pagenode>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
xsl:foreach select="@*"
迭代节点的属性这样您就不必手动复制属性。如果您调用
xsl:apply-templates
在您的 pagenode 元素内部,您应该获得所需的结果。
使
you can iterate over the attributes of an node using
xsl:foreach select="@*"
this way you don't have to copy the attributes by hand. if you call
xsl:apply-templates
inside of yor pagenode element you should get the desired result.
makes
这可能是最短、最纯粹的 XSLT 解决方案:
当此转换应用于提供的 XML 文档时:
生成所需的正确结果:
说明:
身份规则(模板)“按原样”复制每个节点。使用身份规则并覆盖它是最基本的 XSLT 设计模式。
有一个模板可以覆盖身份规则——适用于
fornavbar
属性为“false”
的元素。这里指定的操作是在当前元素的子元素上应用模板。This is probably the shortest and purest XSLT solution:
when this transformation is applied on the provided XML document:
the wanted, correct result is produced:
Explanation:
The identity rule (template) copies every node "as-is". Using the identity rule and overriding it is the most fundamental XSLT design pattern.
There is a single template that overrides the identity rule -- for elements whose
fornavbar
attribute is"false"
. Here the specified action is to apply-templates on the children of the current element.XSLT 应该如下所示:
XSLT should look like this: