XSLT 过滤掉节点并生成新的 xml

Posted

技术标签:

【中文标题】XSLT 过滤掉节点并生成新的 xml【英文标题】:XSLT to filter out nodes and generate new xml 【发布时间】:2019-11-06 17:58:53 【问题描述】:

我有以下 XML,我需要在其中过滤掉 <rule> 节点,该节点的子节点为 <match>,其属性值不包含 .aspx

原始 XML:

<?xml version="1.0" encoding="UTF-8"?>  
<rewrite>
    <rules>
        <rule name="welcome2020" stopProcessing="true">
            <match url="welcome2020"/>
            <action type="Redirect" url="https://www.mywebsite.org/Pages/.welcome2020aspx" appendQueryString="false"/>
        </rule>
        <rule name="Page to Page Redirect">
            <match url="/Staff/Pages/Ashley.aspx"/>
            <action type="Rewrite" url="services/Staff/Pages/Ashley.aspx"/>
        </rule>
        <rule name="Page to Page Redirect">
            <match url="ENT"/>
            <action type="Rewrite" url="services/audiology/earnosethroat.aspx"/>
        </rule>
    </rules>
</rewrite>

转换后,我希望 XML 是:

<?xml version="1.0" encoding="UTF-8"?>
  <rewrite>
    <rules>
        <rule name="welcome2020" stopProcessing="true">
            <match url="welcome2020"/>
            <action type="Redirect" url="https://www.mywebsite.org/Pages/.welcome2020aspx" appendQueryString="false"/>
        </rule> 
        <rule name="Page to Page Redirect">
            <match url="ENT"/>
            <action type="Rewrite" url="services/audiology/earnosethroat.aspx"/>
        </rule>
    </rules>
</rewrite>

下面是我想出的一些 XSLT。我基本上无法想出一个能够根据匹配的子节点选择父节点的模板。这可能吗?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="//rewrite/rules/rule/match[contains(@url,'aspx')]/parent::rule" />

</xsl:stylesheet>

这个想法是 XSLT 基本上删除了任何具有子节点 &lt;match&gt;&lt;rule&gt; 节点,并且 &lt;match&gt; 节点的 URL 属性包含 .aspx

【问题讨论】:

Stack Overflow 不是代码编写服务:***.com/help/on-topic 【参考方案1】:

这个想法是 XSLT 基本上删除任何具有子节点 &lt;match&gt;&lt;rule&gt; 节点,并且 &lt;match&gt; 节点具有包含 .aspx 的 URL 属性

那么怎么样:

XSLT 1.0

<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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="rule[contains(match/@url,'.aspx')]" />

</xsl:stylesheet>

【讨论】:

谢谢!!你所拥有的和这个 &lt;xsl:template match="rule[match[contains(@url,'aspx')]]"/&gt; 有什么区别?是否在子节点与父节点上测试“包含”测试? @AJSwift 不同风格的东西是一样的。

以上是关于XSLT 过滤掉节点并生成新的 xml的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 通过仅过滤标记值等于的那些节点来创建另一个 XML

XSLT:使用输入 XML 中的唯一且已排序的日期创建新的 XML 节点

基于 XSD 变化的动态 XSLT 生成

将boost变体的向量过滤成新的向量?

XSLT 导出过滤器产生不必要的空 XML 标记

使用 XSLT 翻译功能或更好的方法删除单引号和双引号