/ / Usuwanie atrybutów z elementów, które mają określoną wartość - xslt, xsd, xslt-2.0

Usuwanie atrybutów z elementów, które mają określoną wartość - xslt, xsd, xslt-2.0

Piszę arkusz stylów, aby "kanonizować" XMLschematy, aby ułatwić porównywanie ich. Sortuje elementy najwyższego poziomu według nazwy, atrybutu kolejności w ustalonym porządku itd. Oto, co mam do tej pory dla atrybutów:

<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 chciałbym również usunąć nadmiarowe atrybuty. Na przykład, use = "optional" należy odrzucić, ponieważ optional i tak jest domyślnie.

Moje pytanie brzmi: jaki byłby najprostszy sposób na ulepszenie powyższego kodu w celu upuszczenia go use atrybut, gdy jego wartość jest optional?

Odpowiedzi:

0 dla odpowiedzi № 1

@JohnBollinger i @MartinHonnen poprawnie zwrócił uwagę, że @* warunek wstawi wszystkie atrybuty, nawette wybrane powyżej. Tak więc warunek musi zostać udoskonalony. Zwrócono również uwagę, że zgodnie ze specyfikacją nie można zagwarantować kolejności atrybutów. Fakt, że oni zamówienie jest po prostu artefaktem, jak działa mój procesor (Saxon9-HE). W porządku, ale oto rozwiązanie, do którego doszedłem:

<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>

Nie dodałem innych nazw atrybutów do filtra ujemnego @* ponieważ Saxon nie zduplikował atrybutów i pozostawił je w wymaganej kolejności, nawet jeśli został ponownie wstawiony przez @* klauzula. Więc to spełnia moje obecne potrzeby przy jak najmniejszym wysiłku, nawet jeśli nie jest to rozwiązanie ogólne (którego naprawdę nie potrzebuję).