我尝试没有太多运气只是删除一个角色" 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文件的方法在这里做了细微的更改,对我来说是新的。
答案 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>