[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XPath to select based on attr = same attr of an a
At 2008-07-13 20:46 -0400, Syd Bauman wrote:
The idea here is that I want a template that will match any <foreign> element that has a lang= attribute with a value that matches the lang= attribute value of said <foreign> element's nearest ancestor that has a lang= attribute specified. (So that I can delete said <foreign>.) Below is a solution "syd.xsl" that uses a modification of your input that includes French for testing purposes. It reads: match="foreign[@lang=ancestor::*[@lang][1]/@lang]" "match the foreign element whose lang attribute is equal to the lang attribute of the closest ancestor with a lang attribute" I've also included a solution that uses xml:lang= instead of lang= since there are more semantics for xml:lang= ... for example, in the third test the xml:lang= of the document is a subset of the xml:lang= of the embedded content. I don't know if this will be of help or not (in fact, it might be backwards from what you need and not of any use). I hope this helps. . . . . . . . . . . . . Ken t:\ftemp>type test_remove_redundant_foreign_input.xml <?xml version="1.0" encoding="UTF-8"?> <test lang="en"> <p>This is a <foreign lang="en">test</foreign> of the non-<foreign lang="en">emergency</foreign> element tag-removal <foreign lang="en">system</foreign>. This is only a <foreign lang="en">test</foreign>.</p> <p> <list> <item><foreign lang="en">one</foreign></item> <item><foreign lang="en">two</foreign></item> <item><foreign lang="en">three</foreign></item> <item><foreign lang="en">four</foreign></item> </list> </p> <p> <foreign lang="en">one</foreign> <foreign lang="en">two</foreign> <foreign lang="en">three</foreign> <foreign lang="en">four</foreign> <foreign lang="fr">un</foreign> <foreign lang="fr">deux</foreign> <foreign lang="fr">trois</foreign> <foreign lang="fr">quatre</foreign> </p> </test> t:\ftemp>type syd.xsl <?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="@*|node()"><!--identity for all other nodes--> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="foreign[@lang=ancestor::*[@lang][1]/@lang]"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> t:\ftemp>call xslt test_remove_redundant_foreign_input.xml syd.xsl result.xml t:\ftemp>type result.xml <?xml version="1.0" encoding="utf-8"?><test lang="en"> <p>This is a test of the non-emergency element tag-removal system. This is only a test.</p> <p> <list> <item>one</item> <item>two</item> <item>three</item> <item>four</item> </list> </p> <p> one two three four <foreign lang="fr">un</foreign> <foreign lang="fr">deux</foreign> <foreign lang="fr">trois</foreign> <foreign lang="fr">quatre</foreign> </p> </test> t:\ftemp>type test_remove_redundant_foreign_input2.xml <?xml version="1.0" encoding="UTF-8"?> <test xml:lang="en"> <p>This is a <foreign xml:lang="en">test</foreign> of the non-<foreign xml:lang="en">emergency</foreign> element tag-removal <foreign xml:lang="en">system</foreign>. This is only a <foreign xml:lang="en">test</foreign>.</p> <p> <list> <item><foreign xml:lang="en">one</foreign></item> <item><foreign xml:lang="en">two</foreign></item> <item><foreign xml:lang="en">three</foreign></item> <item><foreign xml:lang="en">four</foreign></item> </list> </p> <p> <foreign xml:lang="en">one</foreign> <foreign xml:lang="en">two</foreign> <foreign xml:lang="en">three</foreign> <foreign xml:lang="en">four</foreign> <foreign xml:lang="fr">un</foreign> <foreign xml:lang="fr">deux</foreign> <foreign xml:lang="fr">trois</foreign> <foreign xml:lang="fr">quatre</foreign> </p> </test> t:\ftemp>type syd2.xsl <?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="@*|node()"><!--identity for all other nodes--> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="foreign[lang(ancestor::*[@xml:lang][1]/@xml:lang)]"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> t:\ftemp>call xslt test_remove_redundant_foreign_input2.xml syd2.xsl result2.xml t:\ftemp>type result2.xml <?xml version="1.0" encoding="utf-8"?><test xml:lang="en"> <p>This is a test of the non-emergency element tag-removal system. This is only a test.</p> <p> <list> <item>one</item> <item>two</item> <item>three</item> <item>four</item> </list> </p> <p> one two three four <foreign xml:lang="fr">un</foreign> <foreign xml:lang="fr">deux</foreign> <foreign xml:lang="fr">trois</foreign> <foreign xml:lang="fr">quatre</foreign> </p> </test> t:\ftemp>type test_remove_redundant_foreign_input3.xml <?xml version="1.0" encoding="UTF-8"?> <test xml:lang="fr"> <p>This is a <foreign xml:lang="en">test</foreign> of the non-<foreign xml:lang="en">emergency</foreign> element tag-removal <foreign xml:lang="en">system</foreign>. This is only a <foreign xml:lang="en">test</foreign>.</p> <p> <list> <item><foreign xml:lang="en">one</foreign></item> <item><foreign xml:lang="en">two</foreign></item> <item><foreign xml:lang="en">three</foreign></item> <item><foreign xml:lang="en">four</foreign></item> </list> </p> <p> <foreign xml:lang="en">one</foreign> <foreign xml:lang="en">two</foreign> <foreign xml:lang="en">three</foreign> <foreign xml:lang="en">four</foreign> <foreign xml:lang="fr-ca">un</foreign> <foreign xml:lang="fr-ca">deux</foreign> <foreign xml:lang="fr-ca">trois</foreign> <foreign xml:lang="fr-ca">quatre</foreign> </p> </test> t:\ftemp>call xslt test_remove_redundant_foreign_input3.xml syd2.xsl result3.xml t:\ftemp>type result3.xml <?xml version="1.0" encoding="utf-8"?><test xml:lang="fr"> <p>This is a <foreign xml:lang="en">test</foreign> of the non-<foreign xml:lang="en">emergency</foreign> element tag-removal <foreign xml:lang="en">system</foreign>. This is only a <foreign xml:lang="en">test</foreign>.</p> <p> <list> <item><foreign xml:lang="en">one</foreign></item> <item><foreign xml:lang="en">two</foreign></item> <item><foreign xml:lang="en">three</foreign></item> <item><foreign xml:lang="en">four</foreign></item> </list> </p> <p> <foreign xml:lang="en">one</foreign> <foreign xml:lang="en">two</foreign> <foreign xml:lang="en">three</foreign> <foreign xml:lang="en">four</foreign> un deux trois quatre </p> </test>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|