Im really new with XSLT and I want to remove all the hyphens in my XML, whether it is in the attribute value or in text, I have this XML:
<?xml version="1.0" encoding="UTF-8"?>
<SECTION name="-001">
<THINGS>
<THING evaluationZ="-29" evaluationY="226" action="-MOVE" name="-XYZ">
<CT>
<work task="1">-ALL </work>
<work task="2">-HIGH</work>
<work task="3">-FAST</work>
<work task="4">DET</work>
<work task="5">-COMPLETE</work>
<work task="6">-FINISH</work>
</CT>
<VAC>
<days amount="0"/>
<days amount="2"/>
</VAC>
</THING>
<THINGS>
</SECTION>
And I want this at the output, exactly the same but without any hyphen :
<?xml version="1.0" encoding="UTF-8"?>
<SECTION name="001">
<THINGS>
<THING evaluationZ="29" evaluationY="226" action="MOVE" name="XYZ">
<CT>
<work task="1">ALL </work>
<work task="2">HIGH</work>
<work task="3">FAST</work>
<work task="4">DET</work>
<work task="5">COMPLETE</work>
<work task="6">FINISH</work>
</CT>
<VAC>
<days amount="0"/>
<days amount="2"/>
</VAC>
</THING>
<THINGS>
</SECTION>
I have this XSLT, but its not working
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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="/">
<xsl:value-of select="translate(.,'- ','')"/>
</xsl:template>
</xsl:stylesheet>
how can I write the XSLT to achieve what is described above?
CodePudding user response:
Instead of the <xsl:template match="/">
, you need one template that transforms text content and one that transforms attributes:
<xsl:template match="text()" priority="1">
<xsl:value-of select="translate(.,'-','')"/>
</xsl:template>
<xsl:template match="@*" priority="1">
<xsl:attribute name="{name()}">
<xsl:value-of select="translate(.,'-','')"/>
</xsl:attribute>
</xsl:template>
With these priority
attributes, you can keep the <xsl:template match="@*|node()">
.
CodePudding user response:
The correct answer is:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="translate(.,'-','')"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="translate(.,'-','')"/>
</xsl:template>
</xsl:stylesheet>
Note that this will not copy comments or processing instructions.