从属性节点和文本中删除前导X.

时间:2018-06-14 20:12:19

标签: xslt

我尝试没有太多运气只是删除一个角色" X"来自一个属性。

我有输入:

<?xml version="1.0" encoding="UTF-8"?>
<root>

<Employee>

<Information>
<ID PriorValue="">429</ID>
<Code PriorValue="X55">X5005</Code>
</Information>

</Employee>

<Employee>

<Information>
<ID PriorValue="">950</ID>
<Code PriorValue="X57">X5007</Code>
</Information>

</Employee>

</root>

我试图从Prior_Value属性和代码中删除大写X,如下所示:

<root>

<Employee>

<Information>
<ID PriorValue="">429</ID>
<Code PriorValue="55">5005</Code>
</Information>

</Employee>

<Employee>

<Information>
<ID PriorValue="">950</ID>
<Code PriorValue="57">5007</Code>
</Information>

</Employee>

</root>

这似乎有效,但不确定它是否是理想的方法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 version="1.0" xmlns:pi="urn:com.workday/picof">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="Information/Code">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="PriorValue">
<xsl:value-of select="translate(@PriorValue,'X','')"/>
</xsl:attribute>
<xsl:value-of select="translate(Code,'X','')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

我的主要任务是使用for-each构造将xml数据集转换为固定宽度或csv格式。但现在我被要求进行全局搜索和替换操作,并为大型复杂的xml文件重新排列xpath。将模板应用于整个xml文件的方法在这里做了细微的更改,对我来说是新的。

1 个答案:

答案 0 :(得分:0)

你几乎要从值中删除X。您需要在Information/Code模板中进行一项小改动,即更改以下行

<xsl:value-of select="translate(Code,'X','')"/>

<xsl:value-of select="translate(.,'X','')"/>

由于当前上下文已经是Code,因此XSLT将尝试检查Code/Code以替换不是所需的值。更改是查找.,即当前节点的值而不是Code。更新的模板应该看起来像

<xsl:template match="Information/Code">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:attribute name="PriorValue">
            <xsl:value-of select="translate(@PriorValue,'X','')" />
        </xsl:attribute>
        <xsl:value-of select="translate(.,'X','')" />
    </xsl:copy>
</xsl:template>

输出

<root>
    <Employee>
        <Information>
            <ID PriorValue="">429</ID>
            <Code PriorValue="55">5005</Code>
        </Information>
    </Employee>
    <Employee>
        <Information>
            <ID PriorValue="">950</ID>
            <Code PriorValue="57">5007</Code>
        </Information>
    </Employee>
</root>