我想使用 xslt 对以下 xml 执行两个任务。 你能帮忙吗,谢谢。
- 如果有字符串"null",请将其替换为空字符串
- 其中 SSN 以零开头截断它们
有人可以把我放在正确的方向上吗?
源 XML:
<?xml version='1.0'?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore>
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
<SSN>0001111</SSN>
<address></address>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
<SSN>0001112</SSN>
<address></address>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<first-name>JJ</first-name>
<last-name>MM</last-name>
<SSN>0001113</SSN>
<address>null</address>
</author>
<price>5.99</price>
</book>
</bookstore>
生成的 XML 示例
<bookstore>
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
<SSN>0001112</SSN>
<address></address>
</author>
<price>8.99</price>
</book>
...
</bookstore>
您可以在标识转换中使用两个专用模板完成所需的操作。
- 使用
xsl:number
或number()
函数删除前导零的 SSN 模板 - 与计算值的任何元素匹配的模板为"null",并复制该元素而不包含其任何内容。
应用于以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--identity template, which will copy all content by default-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--For all SSN elements,
copy the matched element and use xsl:number to
remove any leading zeros from the value -->
<xsl:template match="SSN">
<xsl:copy>
<xsl:number value="."/>
</xsl:copy>
</xsl:template>
<!--for any element who's computed value is "null",
copy the element and do not copy it's value(removing "null")-->
<xsl:template match="*[.='null']">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
在text()
节点而不是其元素上匹配的较短版本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!--identity template, which will copy all content by default-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--For all text() nodes of SSN elements,
Use xsl:number to remove any leading zeros from the value -->
<xsl:template match="SSN/text()">
<xsl:number value="."/>
</xsl:template>
<!--for any text() node who's value is "null", suppress it from the output-->
<xsl:template match="*/text()[.='null']"/>
</xsl:stylesheet>