/ / Odstránenie atribútov z prvkov, keď majú určitú hodnotu - xslt, xsd, xslt-2.0

Odstránenie atribútov z prvkov, keď majú určitú hodnotu - xslt, xsd, xslt-2.0

Píšem šablónu štýlov na „kanonizáciu“ XMLschémy, aby sa uľahčilo ich porovnanie. Zoradí prvky najvyššej úrovne podľa názvu, atribútu order v pevnom poradí atď. To je to, čo zatiaľ pre atribúty mám:

<xsl:template match="xsd:attribute">
<xsl:copy>
<xsl:copy-of select="@name"/>
<xsl:copy-of select="@type"/>
<xsl:copy-of select="@ref"/>
<xsl:copy-of select="@use"/>
<xsl:copy-of select="@default"/>
<xsl:apply-templates select="@*">
<xsl:sort select="name()"/>
</xsl:apply-templates>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>

Teraz by som rád odstránil aj nadbytočné atribúty. Napríklad, use = "optional" by malo byť zrušené, pretože optional je aj tak predvolená.

Takže moja otázka znie: aký by bol najjednoduchší spôsob, ako vylepšiť vyššie uvedený kód, aby sa z neho dalo vypnúť use atribút, keď je jeho hodnota optional?

odpovede:

0 pre odpoveď č. 1

@JohnBollinger a @MartinHonnen správne poukázali na to, že @* podmienka vloží všetky atribúty, dokoncavyššie vybrané. Podmienka musí byť teda vylepšená. Poukázalo sa tiež na to, že podľa špecifikácie nie je možné zabezpečiť poradie atribútov. Skutočnosť, že oni objednávka je jednoducho artefakt toho, ako môj procesor (Saxon9-HE) náhodou funguje. S tým som v poriadku. Tu je riešenie, ku ktorému som dospel:

<xsl:template match="xsd:attribute">
<xsl:copy>
<xsl:copy-of select="@name" />
<xsl:copy-of select="@type" />
<xsl:copy-of select="@ref" />
<xsl:copy-of select="@use[string() != "optional"]" />
<xsl:copy-of select="@default" />
<xsl:apply-templates select="@*[name(.) != "use"]">
<xsl:sort select="name()" />
</xsl:apply-templates>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>

Nepridal som ďalšie názvy atribútov do negatívneho filtra @* pretože Saxon nezíska duplicitné atribúty a ponechá ich v požadovanom poradí, aj keď ich znova vloží @* doložka. Toto teda uspokojuje moje súčasné potreby s najmenším úsilím, aj keď nejde o všeobecné riešenie (ktoré vlastne ani nepotrebujem).