XSLT code

P

paul_0403

I have the following XML file

<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
<RequestInfo>
<ResponseFile Mode="Overwrite"></ResponseFile>
<StatusFile></StatusFile>
</RequestInfo>
</CentralServerRequest>

I tried the following xslt code but can't seem to get it working.

response_file=e:/tmp/response.xml
status_file=d:/tmp/status.xml

<xsl:template match="StatusFile[. = '' ">
<xsl:copy>
<xsl:value-of select="$status_file"/>
</xsl:copy>
</xsl:template


Can somebody show me how to insert values associated with a variable
into the XML so the output will look like this:

<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
<RequestInfo>
<ResponseFile Mode="Overwrite">e:/tmp/response.xml</
ResponseFile>
<StatusFile>d:/tmp/status.xml</StatusFile>
</RequestInfo>
</CentralServerRequest>


Thanks in advance to all who answer
 
J

Joseph J. Kesselman

In general, to "insert something into" or "remove something from" an XML
document using XSLT:

Start with the identity transformation. (See the XSLT Recommendation or
any good XSLT tutorial). That handles copying everything that should
pass through unchanged.

Then add a template which recognizes the place where you want to do
something different, and give it a body that Does The Right Thing at
that point.
 
P

paul_0403

In general, to "insert something into" or "remove something from" an XML
document using XSLT:

Start with the identity transformation. (See the XSLT Recommendation or
any good XSLT tutorial). That handles copying everything that should
pass through unchanged.

Then add a template which recognizes the place where you want to do
something different, and give it a body that Does The Right Thing at
that point.

Thanks for your response. I was sort of hoping you can tell me what I
was doing wrong in my example or maybe give me a similar working
example
 
M

Martin Honnen

Can somebody show me how to insert values associated with a variable
into the XML so the output will look like this:

<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
<RequestInfo>
<ResponseFile Mode="Overwrite">e:/tmp/response.xml</
ResponseFile>
<StatusFile>d:/tmp/status.xml</StatusFile>
</RequestInfo>
</CentralServerRequest>

Here is a sample stylesheet that uses the identity transformation
template and two templates to modify the ResponseFile and StatusFile
elements:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:param name="response_file" select="'e:/tmp/response.xml'"/>
<xsl:param name="status_file" select="'d:/tmp/status.xml'"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="ResponseFile[not(node())]">
<xsl:copy>
<xsl:value-of select="$response_file"/>
</xsl:copy>
</xsl:template>

<xsl:template match="StatusFile[not(node())]">
<xsl:copy>
<xsl:value-of select="$status_file"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>
 
P

paul_0403

Can somebody show me how to insert values associated with a variable
into the XML so the output will look like this:
<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
    <RequestInfo>
        <ResponseFile Mode="Overwrite">e:/tmp/response.xml</
ResponseFile>
        <StatusFile>d:/tmp/status.xml</StatusFile>
    </RequestInfo>
</CentralServerRequest>

Here is a sample stylesheet that uses the identity transformation
template and two templates to modify the ResponseFile and StatusFile
elements:

<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="1.0">

   <xsl:param name="response_file" select="'e:/tmp/response.xml'"/>
   <xsl:param name="status_file" select="'d:/tmp/status.xml'"/>

   <xsl:template match="@* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="ResponseFile[not(node())]">
     <xsl:copy>
       <xsl:value-of select="$response_file"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="StatusFile[not(node())]">
     <xsl:copy>
       <xsl:value-of select="$status_file"/>
     </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

Martin,

The example for Statusfile works but the example for the ResponseFile
does not work.

Note the elments are a bit different since there is an attrtibute
"Mode" in the ResponseFile element
as there is no attribute in the StatusFile element.

<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
<RequestInfo>
<ResponseFile Mode="Overwrite"></ResponseFile>
<StatusFile></StatusFile>
</RequestInfo>
</CentralServerRequest>


Based on that, I am assumming the XSLT code has to look a bit
different when doing the match? Is there some sytnax to specify the
atttibute name in the matc?. It would be okay with matching
"ResponseFile Mode" and skipping the value "OverWrite" since my Mode
can have several different
values that I may want to ignore.

THanks in advance for all your help!!!
 
M

Martin Honnen

<xsl:template match="ResponseFile[not(node())]">
<xsl:copy>
<xsl:value-of select="$response_file"/>
</xsl:copy>
</xsl:template>
Note the elments are a bit different since there is an attrtibute
"Mode" in the ResponseFile element
as there is no attribute in the StatusFile element.

<?xml version="1.0" encoding="UTF-8"?>
<CentralServerRequest>
<RequestInfo>
<ResponseFile Mode="Overwrite"></ResponseFile>

If you want to copy the attribute use

<xsl:template match="ResponseFile[not(node())]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$response_file"/>
</xsl:copy>
Based on that, I am assumming the XSLT code has to look a bit
different when doing the match? Is there some sytnax to specify the
atttibute name in the matc?. It would be okay with matching
"ResponseFile Mode" and skipping the value "OverWrite" since my Mode
can have several different
values that I may want to ignore.

If you want to add the text if the Mode attribute exists then use

<xsl:template match="ResponseFile[@Mode and not(node())]">
<xsl:copy>
<xsl:value-of select="$response_file"/>
</xsl:copy>
</xsl:template>
 
P

paul_0403

   <xsl:template match="ResponseFile[not(node())]">
     <xsl:copy>
       <xsl:value-of select="$response_file"/>
     </xsl:copy>
   </xsl:template>
Note the elments are a bit different since there is an attrtibute
"Mode" in the ResponseFile element
as there is no attribute in the StatusFile element.
 <?xml version="1.0" encoding="UTF-8"?>
 <CentralServerRequest>
     <RequestInfo>
         <ResponseFile Mode="Overwrite"></ResponseFile>

If you want to copy the attribute use

   <xsl:template match="ResponseFile[not(node())]">
     <xsl:copy>
       <xsl:apply-templates select="@*"/>
       <xsl:value-of select="$response_file"/>
     </xsl:copy>
    said:
Based on that, I am assumming the XSLT code has to look a bit
different when doing the match? Is there some sytnax to specify the
atttibute name in the matc?. It would be okay with matching
"ResponseFile Mode" and skipping the value  "OverWrite" since my Mode
can have several different
values that I may want to ignore.

If you want to add the text if the Mode attribute exists then use

   <xsl:template match="ResponseFile[@Mode and not(node())]">
     <xsl:copy>
       <xsl:value-of select="$response_file"/>
     </xsl:copy>
   </xsl:template>

Thanks I appreciate your expertise and help
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top