2

XML

<?xml-stylesheet type="text/xsl" href="script.xsl"?>
<elements>
  <stack>
    <name>Ray</name>
    <status>0</status>
  </stack>
<!-- Comment 1 -->
  <things>
  <!-- Comment 2 -->
    <thing>
      <color>red</color>
      <!-- State Comment -->
      <state>solid</state>
      <!-- Weight Comment -->
      <weight>45</weight>
      <unit>34</unit>
      <!-- Comment 3 -->
    </thing>
 </things>
 <favs>
   <stick>ready</stick>
   <!-- Comment 4-->
 </favs>
</elements>

期待される出力

<elements>
  <stack>
    <name>Ray</name>
    <status>0</status>
  </stack>
  <!-- Comment 1 -->
  <mainElements>
  <!-- Comment 2 -->
    <specialThing>
      <!-- Weight Comment -->
      <PropertyOne>45</PropertyOne>
      <PropertyTwo>red</PropertyTwo>
      <!-- State Comment -->
      <PropertyThree>solid</PropertyThree>
    </specialThing>
  <!-- Comment 3 -->
  </mainElements>
 <favs>
     <stick>ready</stick>
     <!-- Comment 4-->
 </favs>
</elements>

現在の XSL

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">
<xsl:output method="xml" indent="yes"/>

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


<xsl:template match="things">
        <mainElements>
            <xsl:apply-templates select="thing"/>
        </mainElements>
    </xsl:template>


<xsl:template match="thing">
    <specialThing>
        <xsl:apply-templates select="weight"/>
    <xsl:apply-templates select="color"/>
    <xsl:apply-templates select="state"/>
        </specialThing>
</xsl:template>


<xsl:template match="weight">
    <PropertyOne>
       <xsl:value-of select="."/>
       </PropertyOne>
</xsl:template>

<xsl:template match="color">
    <PropertyTwo>
       <xsl:value-of select="."/>
        </PropertyTwo>
</xsl:template>

<xsl:template match="state">
    <PropertyThree>
       <xsl:value-of select="."/>
        </PropertyThree>
</xsl:template>
</xsl:stylesheet>

出力で述べたように、出力を適切にインデントできませんでした。しかし、私が達成したい主なことは、出力で維持されるタグのコメントを維持することです。

例: weight という名前のタグは「PropertyOne」に名前が変更され、値も出力に保持されます。しかし、同じ上のコメントがありません。出力にも同じコメントを残しておきたいです。どうすればそれを達成できますか?

4

1 に答える 1

1

xsl:apply-templates前の兄弟に対してを実行する必要がありますcomment()weight/ color/の順序を変更しているため、state各テンプレートに追加する必要があります。

また、マッチングComment 3はトリッキーであり、私が行ったことは実際のデータでは機能しない可能性があります.

XML 入力

<elements>
    <stack>
        <name>Ray</name>
        <status>0</status>
    </stack>
    <!-- Comment 1 -->
    <things>
        <!-- Comment 2 -->
        <thing>
            <color>red</color>
            <!-- State Comment -->
            <state>solid</state>
            <!-- Weight Comment 1 -->
            <!-- Weight Comment 2 -->
            <weight>45</weight>
            <unit>34</unit>
            <!-- Comment 3 -->
        </thing>
    </things>
    <favs>
        <stick>ready</stick>
        <!-- Comment 4-->
    </favs>
</elements>

XSLT1.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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


    <xsl:template match="things">
        <mainElements>
            <xsl:apply-templates select="thing|comment()"/>
        </mainElements>
    </xsl:template>


    <xsl:template match="thing">
        <specialThing>
            <xsl:apply-templates select="weight"/>
            <xsl:apply-templates select="color"/>
            <xsl:apply-templates select="state"/>           
        </specialThing>
        <xsl:apply-templates select="comment()[not(following-sibling::*)]"/>
    </xsl:template>


    <xsl:template match="weight">
        <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/>
        <PropertyOne>
            <xsl:value-of select="."/>
        </PropertyOne>
    </xsl:template>

    <xsl:template match="color">
        <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/>
        <PropertyTwo>
            <xsl:value-of select="."/>
        </PropertyTwo>
    </xsl:template>

    <xsl:template match="state">
        <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/>
        <PropertyThree>
            <xsl:value-of select="."/>
        </PropertyThree>
    </xsl:template>

</xsl:stylesheet>

XML 出力

<elements>
    <stack>
        <name>Ray</name>
        <status>0</status>
    </stack>
    <!-- Comment 1 -->
    <mainElements>
        <!-- Comment 2 -->
        <specialThing>
            <!-- Weight Comment 1 -->
            <!-- Weight Comment 2 -->
            <PropertyOne>45</PropertyOne>
            <PropertyTwo>red</PropertyTwo>
            <!-- State Comment -->
            <PropertyThree>solid</PropertyThree>
        </specialThing>
        <!-- Comment 3 -->
    </mainElements>
    <favs>
        <stick>ready</stick>
        <!-- Comment 4-->
    </favs>
</elements>
于 2013-07-17T16:21:06.553 に答える