/ / Видалення атрибутів з елементів, коли вони мають певне значення - xslt, xsd, xslt-2.0

Видалення атрибутів з елементів, коли вони мають певне значення - xslt, xsd, xslt-2.0

Я пишу таблицю стилів, щоб "канонізувати" XMLсхеми, щоб полегшити їх порівняння. Він сортуватиме елементи верхнього рівня за іменем, атрибутом замовлення у фіксованому порядку тощо. Це те, що я маю щодо атрибутів на даний момент:

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

Тепер я хотів би також видалити зайві атрибути. Наприклад, use = "optional" слід відкинути, оскільки optional так чи інакше за замовчуванням.

Отже, моє запитання: що було б найпростішим способом покращити наведений вище код, щоб скинути use атрибут, коли його значення дорівнює optional?

Відповіді:

0 для відповіді № 1

@JohnBollinger та @MartinHonnen правильно вказали, що @* умова вставить усі атрибути, навітьвибрані вище. Тож умова має бути уточненою. Також було зазначено, що відповідно до специфікації порядок атрибутів не може бути забезпечений. Справа в тому, що вони є замовлення - це просто артефакт того, як працює мій процесор (Saxon9-HE). З цим я все гаразд. Ось рішення, до якого я прийшов:

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

Я не додав інші імена атрибутів до мінус-фільтра на @* оскільки Саксон не виграв дублікатів атрибутів і залишає їх у необхідному порядку, навіть якщо він буде повторно вставлений @* застереження. Отже, це справді задовольняє мої нинішні потреби з найменшими зусиллями, хоча це не загальне рішення (яке мені насправді не потрібно).