xsl-list
[Top] [All Lists]

Re: [xsl] searching for occurrences of unique string-value and replacing with string value of another node

2008-06-05 12:53:29
I hope I got your case correct, with the help of wonderful Kernow (http://kernowforsaxon.sf.net/) and its XSLT playground I get this result (after completing the XML and after making the separate guids in the XML more verbose:

Using a key is a good idea. I do not understand what you mean with a sub-node, try this:

<xsl:key name="targetFile" match="File" use=".//CuHistoryGuid/text()"/>

<xsl:template match="RelatedLinks/CuRef">
  <a class="old" href="{(_at_)CuHistoryGuid}(_dot_)html">
     <xsl:apply-templates/>
  </a>
<a class="new" href="{key('targetFile', @CuHistoryGuid)/FileGuid/ text()}.html">
     <xsl:apply-templates/>
  </a>
</xsl:template>

The key "targetFile" indexes all elements File according to the text content of their descendant "CuHistoryGuid".

You may also notice the use of AVT (Attribute Value Templates = expressions in {} used in attribute values) to make the code more readable. It should work with XSLT 1.0, although I tested only with 2.0.

HTH,

- Michael

Am 05.06.2008 um 20:08 schrieb Julie:

I've searched the archives, but I either haven't found anything that
would help with this or I haven't recognized what I should be looking
for!

What I have is an xml publication file that contains a list of File
elements. Each of these File elements outputs a different html file.
Within the html files there are optional related links. We use the
CuHistoryGuid element to identify these related links, the number for
which is generated dynamically by the database. Unfortunately, the
original programmer of our application agreed that these guids would
become the output filename and in fact they are not. Instead there is
another guid, generated by the File element, that is used as the
filename. What I need to do is use the stylesheet to search for the
unique value of the CuHistoryGuid, find it elsewhere in the file and
then go UP to the corresponding FileGuid and replace the value with
that. I was looking at using the key function, but it requires a
sub-node (if I understand it correctly) rather than an ancestor node.
Is there another way to accomplish this?

The xml looks roughly like this:

<PublicationContent>

   <File>
          <FileGuid>944f983d-110f-4d08-9c69-1e9f019228ac</FileGuid>
          <FileShortDescription>Help 1</FileShortDescription>
          <ContentUnit>
               <CuMetadata>
                      <BinaryType>no</BinaryType>
                      <CuHistoryGuid>CuHistoryGuid</CuHistoryGuid>
               </CuMetadata>
               <CuContent>
                      <Task>
                            <RelatedLinks>
                                     <CuRef
CuHistoryGuid="072aea44-573d-43b6-8a64-5cbd1ffccea8">Related link
text</CuRef>
                            </RelatedLinks>
                            (content, etc....)
         </ContentUnit>
     </File>



     <File>
          <FileGuid>e47267b0-7167-4cfd-a4c1-18dbb3a33b4d</FileGuid>
          <FileShortDescription>Help 2</FileShortDescription>
          <ContentUnit>
               <CuMetadata>
                      <BinaryType>no</BinaryType>

<CuHistoryGuid>072aea44-573d-43b6-8a64-5cbd1ffccea8</CuHistoryGuid>
(etc.)



Current template in xsl file:

<xsl:template match="RelatedLinks/CuRef">
     <a class="rt">
          <xsl:attribute name="href">
<xsl:value-of select="@CuHistoryGuid"/ ><xsl:text>.html</xsl:text>
          </xsl:attribute>
     <xsl:apply-templates/>
    </a>
</xsl:template>



output is:

<p class="RelatedLinks">
     <a class="rt"
href="072aea44-573d-43b6-8a64-5cbd1ffccea8.html">Link Text</a>
</p>



Want the output to be:

<p class="RelatedLinks">
     <a class="rt"
href="e47267b0-7167-4cfd-a4c1-18dbb3a33b4d8.html">Link Text</a>
</p>


where the href equals the FileGuid for the file to which I want to link.



The CuRef element contains the CuHistoryGuid for which I would be
searching outside of this particular File element, but within the same
PublicationContent element.



I am using xmlspy , so their processor (but am definitely willing to
change to 2.0, this is just where we were when we started the
project):

XML Spy 2008 sp 2 (Enterprise edition)

XSL version: 1

Vendor: Altova GmbH

Vendor URL: http://www.altova.com

Thanks for any help!

Julie


--
_______________________________________________________________
Michael Müller-Hillebrand: Dokumentations-Technologie
Adobe Certified Expert, FrameMaker
Lösungen und Training, FrameScript, XML/XSL, Unicode
<http://cap-studio.de/> -- Tel. +49 (9131) 28747




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--