XSLT:如何替换字符串



我想使用 xslt 对以下 xml 执行两个任务。 你能帮忙吗,谢谢。

  1. 如果有字符串"null",请将其替换为空字符串
  2. 其中 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>

您可以在标识转换中使用两个专用模板完成所需的操作。

  1. 使用 xsl:numbernumber() 函数删除前导零的 SSN 模板
  2. 与计算值的任何元素匹配的模板为"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>

相关内容

  • 没有找到相关文章

最新更新