Reputation: 177
I have requirement to find all the text nodes and create new node sequence(see in input/output XML), and if any inline nodes (preceding-sibling or following-sibling of text node), then rename those tags to <x id="XX" local-name='tagName'>text here </x> where "local-name" value should be name of that node. these inline node can be anything, not a specific list. Any pointer/solution would be a great help. Thanks.
XSLT Version 2.0 XSLT processor - Saxon EE/HE 9.X.X.X
<?xml version="1.0" encoding="utf-8"?>
<concept id="001" xml:lang="en-us">
<title id="002">Notice</title>
<shortdesc id="003">This information U.S.A.</shortdesc>
<conbody id="004">
<p id="005">This product blah blah <companyname id="006">blah bla</companyname> No other
warranty expressed or implied. </p>
<p id="007">This supersedes all previous notices.</p>
<section id="008">
<title id="009">COPYRIGHT LICENSE:</title>
<p id="010">This information contains <b id="011">in source language</b> , blah blah</p>
</section>
</conbody>
</concept>
expected output:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<trans-unit id="002">
<source>Notice</source>
<target>Notice</target>
</trans-unit>
<trans-unit id="003">
<source>This information U.S.A.</source>
<target>This information U.S.A.</target>
</trans-unit>
<trans-unit id="005">
<source>This product blah blah <x id="006" local-name="companyname">blah bla</x> No other
warranty expressed or implied. </source>
<target>This product blah blah <x id="006" local-name="companyname">blah bla</x> No other
warranty expressed or implied.</target>
</trans-unit>
<trans-unit id="007">
<source>This supersedes all previous notices.</source>
<target>This supersedes all previous notices.</target>
</trans-unit>
<trans-unit id="009">
<source>COPYRIGHT LICENSE:</source>
<target>COPYRIGHT LICENSE:</target>
</trans-unit>
<trans-unit id="010">
<source>This information contains <x id="011" local-name="b">in source language</x> , blah
blah</source>
<target>This information contains <x id="011" local-name="b">in source language</x> , blah
blah</target>
</trans-unit>
</root>
I am trying something like this:
<xsl:template match="/">
<root>
<xsl:for-each select="//text()">
<xsl:if test=".!='' or .!=' '">
<xsl:choose>
<xsl:when test="not(following-sibling::node()) or not(preceding-sibling::node())">
<trans-unit>
<xsl:attribute name="id">
<xsl:value-of select="../@id"/>
</xsl:attribute>
<source>
<xsl:value-of select="."/>
</source>
<target>
<xsl:value-of select="."/>
</target>
</trans-unit>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</root>
Upvotes: 0
Views: 249
Reputation: 167516
The stylesheet
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="concept">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="concept//*[text()[normalize-space()]]">
<transunit id="{@id}">
<source>
<xsl:apply-templates/>
</source>
<target>
<xsl:apply-templates/>
</target>
</transunit>
</xsl:template>
<xsl:template match="*[not(*)][following-sibling::node()[1][self::text()[normalize-space()]] |
preceding-sibling::node()[1][self::text()[normalize-space()]]]" priority="5">
<x id="{@id}" local-name="{local-name()}">
<xsl:apply-templates/>
</x>
</xsl:template>
</xsl:stylesheet>
transforms your input into the result
<root>
<transunit id="002">
<source>Notice</source>
<target>Notice</target>
</transunit>
<transunit id="003">
<source>This information U.S.A.</source>
<target>This information U.S.A.</target>
</transunit>
<transunit id="005">
<source>This product blah blah <x id="006" local-name="companyname">blah bla</x> No other
warranty expressed or implied. </source>
<target>This product blah blah <x id="006" local-name="companyname">blah bla</x> No other
warranty expressed or implied. </target>
</transunit>
<transunit id="007">
<source>This supersedes all previous notices.</source>
<target>This supersedes all previous notices.</target>
</transunit>
<transunit id="009">
<source>COPYRIGHT LICENSE:</source>
<target>COPYRIGHT LICENSE:</target>
</transunit>
<transunit id="010">
<source>This information contains <x id="011" local-name="b">in source language</x> , blah blah</source>
<target>This information contains <x id="011" local-name="b">in source language</x> , blah blah</target>
</transunit>
</root>
Tested with Saxon 9.5.
Upvotes: 1