XSLT для удаления пустых узлов и узлов с -1
Я не мастер XSLT.
У меня есть текущий XSLT, который я использую для удаления пустых узлов:
string strippingStylesheet = "<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">" +
"<xsl:template match="@*|node()">" +
"<xsl:if test=". != ''">" +
"<xsl:copy>" +
"<xsl:apply-templates select="@*|node()"/>" +
"</xsl:copy>" +
"</xsl:if></xsl:template></xsl:stylesheet>";
Мне нужно найти способ, чтобы удалить узлы с -1 в них. Предыдущий разработчик подумал, что было бы неплохо сделать каждый int в системе по умолчанию равным -1, и да, это означает, что все поля БД имеют -1 в них вместо null.
Так как я хочу бить мертвую лошадь (палкой, битой, базуки), мне нужно вернуться к работе и сделать это сделанный.
любая помощь будет большое.
2 ответов
у меня есть текущий XSLT, который я использую удалить пустые узлы:
. . . . . . . . .
мне нужно найти способ, чтобы удалить узлы с -1 в них
Я думаю, что требуется удалить все "пустые узлы".
обработка зависит от определения "пустой узел". Одно разумное определение в вашем случае:любой элемент, который не имеет атрибутов и детей или не имеет атрибутов и имеет только один дочерний элемент, который является текстовым узлом со значением -1
.
на этой определение вот простое решение.
трансформация:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/>
</xsl:stylesheet>
при применении к этому образцу XML-документа:
<t>
<a>-1</a>
<a>2</a>
<b><c/></b>
<d>-1</d>
<d>15</d>
<e x="1"/>
<f>foo</f>
</t>
производит нужный, правильный результат:
<t>
<a>2</a>
<b/>
<d>15</d>
<e x="1"/>
<f>foo</f>
</t>
в простом случае этого должно работать:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[. = '' or . = '-1']"/>
С помощью этого простого ввода:
<root>
<node></node>
<node>-1</node>
<node>2</node>
<node>8</node>
<node>abc</node>
<node>-1</node>
<node></node>
<node>99</node>
</root>
результат будет:
<root>
<node>2</node>
<node>8</node>
<node>abc</node>
<node>99</node>
</root>