使用 XSLT 1.0 删除相关元素
我正在尝试从下面的 XML 中删除具有扩展名为“config”的 File 子项的 Component 元素。我已经成功完成了这一部分,但我还需要删除与这些组件具有相同“Id”值的匹配 ComponentRef 元素。
<Fragment>
<DirectoryRef Id="MyWebsite">
<Component Id="Comp1">
<File Source="Web.config" />
</Component>
<Component Id="Comp2">
<File Source="Default.aspx" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="MyWebsite">
<ComponentRef Id="Comp1" />
<ComponentRef Id="Comp2" />
</ComponentGroup>
</Fragment>
基于其他 SO 答案,我提出了以下 XSLT 来删除这些 Component 元素:
<?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" indent="yes" />
<xsl:template match="Component[File[substring(@Source, string-length(@Source)- string-length('config') + 1) = 'config']]" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
不幸的是,这不会删除匹配的 ComponentRef 元素(即具有相同“Id”值的元素)。 XSLT 将删除 Id 为“Comp1”的组件,但不会删除 Id 为“Comp1”的 ComponentRef。如何使用 XSLT 1.0 实现这一目标?
I'm attempting to remove Component elements from the XML below that have File children with the extension "config." I've managed to do this part, but I also need to remove the matching ComponentRef elements that have the same "Id" values as these Components.
<Fragment>
<DirectoryRef Id="MyWebsite">
<Component Id="Comp1">
<File Source="Web.config" />
</Component>
<Component Id="Comp2">
<File Source="Default.aspx" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="MyWebsite">
<ComponentRef Id="Comp1" />
<ComponentRef Id="Comp2" />
</ComponentGroup>
</Fragment>
Based on other SO answers, I've come up with the following XSLT to remove these Component elements:
<?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" indent="yes" />
<xsl:template match="Component[File[substring(@Source, string-length(@Source)- string-length('config') + 1) = 'config']]" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Unfortunately, this doesn't remove the matching ComponentRef elements (i.e. those that have the same "Id" values). The XSLT will remove the component with the Id "Comp1" but not the ComponentRef with Id "Comp1". How do I achieve this using XSLT 1.0?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一种相当有效的方法是使用 xsl:key 来识别配置组件的 ID:
A fairly efficient approach is to use
xsl:key
to identify the IDs of config components:这个怎么样?我对您的原始内容做了一个小更改以简化事情(检查 @source 属性是否以“config”结尾更简单)。
它有一个与任何 ComponentRef 相匹配的模板,该 ComponentRef 与前面的模板匹配的 Component 具有相同的 Id 属性。一件事 - '
//Component
' 效率不高。您应该能够用更有效的东西替换它 - 我不知道您的 XML 结构How about this? I've made a small change to your original to simplify things as well (it's simpler to check if the @source attribute ends with 'config').
This has a template that matches any ComponentRef that has the same Id attribute as a Component matched by the preceding template. One thing - the '
//Component
' is not efficient. You should be able to replace that with something more efficient - I don't know your XML structure