1

簡単な質問です。私は1つのXMLを持っていて、他に何も変更せずに、その一部だけを変換したいと思っていました。これが私がやろうとしていることの簡単な例です:

入力:

<?xml version="1.0" encoding="UTF-8"?>
<dita xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/ditabase.xsd">
    <topic id="abc">
        <title>Sample XML</title>
        <body>
         <section id="a">
            <p> Hello section A </p>
         </section>
         <section id="b">
            <p> General Content </p>
         </section>
         <section id="c">
            <p> Hi thank you for coming from $state </p>
         </section>
        </body>
    </topic>
</dita>

出力

<?xml version="1.0" encoding="UTF-8"?>
<dita xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/ditabase.xsd">
    <topic id="abc">
        <title>Sample XML</title>
        <body>
         <section id="a">
            <p> Hello section A </p>
         </section>
         <section id="b">
            <p> General Content </p>
         </section>
         <section id="c" audience = "WA">
            <p> Hi thank you for coming from WA </p>
         </section>
             <section id="c" audience = NY">
            <p> Hi thank you for coming from NY </p>
         </section>
             <section id="c" audience = "AL">
            <p> Hi thank you for coming from AL </p>
         </section>
             <section id="c" audience = "GA">
            <p> Hi thank you for coming from GA </p>
         </section>
            ...
            <!--Continue for the rest of the states--> 
            ...
        </body>
    </topic>
</dita>

それが助けになるなら、私はXALANプロセッサーを使用しています。よろしくお願いします:D

4

1 に答える 1

2

XML の形式を少し変更して、ソリューションをよりシンプルにすることを提案します。

の代わりに:

<p> Hi thank you for coming from $state </p>

使用:

<p> Hi thank you for coming from <state/> </p>

この形式の場合、次の変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:states>
   <state name="WA"/>
   <state name="NY"/>
   <state name="AL"/>
   <state name="GA"/>
 </my:states>

 <xsl:variable name="vStates" select="document('')/*/my:states/*"/>

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

 <xsl:template match="section[descendant::state]">
   <xsl:variable name="vSect" select="."/>

   <xsl:for-each select="$vStates">
     <xsl:apply-templates select="$vSect" mode="generate">
       <xsl:with-param name="pState" select="@name"/>
     </xsl:apply-templates>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="section" mode="generate">
  <xsl:param name="pState"/>

  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:attribute name="audience">
    <xsl:value-of select="$pState"/>
   </xsl:attribute>
   <xsl:apply-templates>
    <xsl:with-param name="pState" select="$pState"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="state">
  <xsl:param name="pState"/>
  <xsl:value-of select="$pState"/>
 </xsl:template>
</xsl:stylesheet>

(わずかに変更された) 提供された XML ドキュメントに適用した場合:

<dita xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/ditabase.xsd">
    <topic id="abc">
        <title>Sample XML</title>
        <body>
         <section id="a">
            <p> Hello section A </p>
         </section>
         <section id="b">
            <p> General Content </p>
         </section>
         <section id="c">
            <p> Hi thank you for coming from <state/> </p>
         </section>
        </body>
    </topic>
</dita>

必要な正しい結果が生成されます

<dita xsi:noNamespaceSchemaLocation="../../../xsd/ditabase.xsd" xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <topic id="abc">
        <title>Sample XML</title>
        <body>
         <section id="a">
            <p> Hello section A </p>
         </section>
         <section id="b">
            <p> General Content </p>
         </section>
         <section id="c" audience="WA">
            <p> Hi thank you for coming from WA </p>
         </section>
<section id="c" audience="NY">
            <p> Hi thank you for coming from NY </p>
         </section>
<section id="c" audience="AL">
            <p> Hi thank you for coming from AL </p>
         </section>
<section id="c" audience="GA">
            <p> Hi thank you for coming from GA </p>
         </section>
        </body>
    </topic>
</dita>
于 2010-07-22T16:33:56.017 に答える