XSLT для фильтрации узлов и создания новых XML - PullRequest
0 голосов
/ 25 июня 2019

У меня есть следующий 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 в основном удаляет любой узел <rule>, имеющий дочерний узел <match>, а узел <match> имеет атрибут URL, содержащий .aspx

1 Ответ

1 голос
/ 25 июня 2019

Идея состоит в том, что XSLT в основном удаляет любой узел <rule>, имеющий дочерний узел <match>, а узел <match> имеет атрибут URL, который содержит .aspx

А как насчет:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...