2017-09-28 18 views
0

XSLTを初めて使用しました。再帰的ノードからの出力が必要なXSLT変換

サンプルXML

<exports> 
    <job>Job1</job> 
    <date>Wed Sep 27 13:19:29 CDT 2017</date> 
    <targets> 
     <target server-name=""> 
      <templates> 
       <template /> 
       <template /> 
      </templates> 
      <components> 
       <component>test2server</component> 
       <component>test4server</component> 
      </components> 
     </target> 
    </targets> 
    <auditrun template="RHEL"> 
     <objects-audited /> 
     <Changed-targets> 
      <target>test2server</target> 
      <target>test4server</target> 
     </Changed-targets> 
     <unchanged-targets /> 
     <changed-audit-items> 
      <node1>"file"</node1> 
      <node2>"filename1"</node2> 
      <node3>"filename1"</node3> 
      <target>"test2server"</target> 
      <node5>"lastnight"</node5> 
     </changed-audit-items> 
     <changed-audit-items> 
      <node1>"registryval"</node1> 
      <node2>"filename2"</node2> 
      <node3>"filename2"</node3> 
      <target>"test4server"</target> 
      <node5>"morning"</node5> 
     </changed-audit-items> 
    </auditrun> 
</exports> 

所望の出力

Changed Audit Items 1 
node 1 - file 
node 2 - filename1 
node 3 - filename1 
target - test2server 
node 5 - lastnight 

Changed Audit items 2 
node 1 - registryval 
node 2 - filename2 
node 3 - filename2 
target - test4server 
node 5 - morning 

マイ変換 - 私は、forループを下記に使用していますが、テキストに出力を印刷する&値を追加したが、所望の取得に失敗しました出力。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="text" indent="no" /> 

    <xsl:template match="/exports"> 
     <xsl:apply-templates select="auditrun" /> 
    </xsl:template> 

    <xsl:template match="auditrun/changed-audit-items"> 
     <xsl:for-each select="exports/auditrun/changed-audit-items/node3"> 
      <xsl:text disable-output-escaping="no"> </xsl:text> 
      <xsl:text disable-output-escaping="yes"> Changed Targets: </xsl:text> 
      <xsl:value-of select="//changed-audit-items/target/text()" disable-output-escaping="no" /> 
     </xsl:for-each> 
     <xsl:variable select="1" name="counter" /> 
     <xsl:variable select="count(//changed-audit-items/node3)" name="CountAuditItems" /> 
     <Audit> 
      <xsl:value-of select="count(//Changed-targets/target)" disable-output-escaping="no" /> 
      <xsl:text disable-output-escaping="no"> Total number of Changed Server Items: </xsl:text> 
      <xsl:value-of select="count(//changed-audit-items/node3)" disable-output-escaping="no" /> 
     </Audit> 
     <xsl:text disable-output-escaping="no"> </xsl:text> 
     <xsl:text disable-output-escaping="no">node1 </xsl:text> 
     <xsl:value-of select="//changed-audit-items/node1/text()" disable-output-escaping="yes" /> 
     <xsl:text disable-output-escaping="no"> </xsl:text> 
     <xsl:text disable-output-escaping="no">node3: </xsl:text> 
     <xsl:value-of select="//changed-audit-items/node3/text()" disable-output-escaping="no" /> 
     <xsl:text disable-output-escaping="no"> </xsl:text> 
     <xsl:text disable-output-escaping="no">Node2: </xsl:text> 
     <xsl:value-of select="//changed-audit-items/node2/text()" disable-output-escaping="no" /> 
     <xsl:text disable-output-escaping="no"> </xsl:text> 
     <xsl:text disable-output-escaping="no">node4</xsl:text> 
     <xsl:value-of select="//changed-audit-items/node4/text()" disable-output-escaping="no" /> 
     <xsl:text disable-output-escaping="no"> </xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

私は専門家に指導を依頼したいと思います。

よろしく、

R
+0

あなたは "下のループ" を使用していない、またはあなたがしている場合、あなたは、XSLTを使用していないです。 –

+0

ここに私が書いた変換があります。 –

答えて

0

所望の出力は、ネストされた<xsl:for-each>ループを使用することによって達成することができます。 <changed-audit-items>ノードをループしてタイトルChanged Audit Itemsを追加し、内側のforループをすべての子ノード<changed-audit-items>にループするための外側。内部ループはノード名とその値を出力に出力します。

以下はXSLT

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

    <xsl:variable name="groupTitle" select="'Changed Audit Items '" /> 
    <xsl:variable name="newline" select="'&#10;'" /> 
    <xsl:variable name="hyphenSeparator" select="' - '" /> 

    <xsl:template match="/"> 
     <!-- loop for all <changed-audit-items> nodes --> 
     <xsl:for-each select="//changed-audit-items"> 
      <xsl:value-of select="concat($groupTitle, position())" /> 
      <xsl:value-of select="$newline" /> 
      <!-- loop for all child nodes of <changed-audit-items> --> 
      <xsl:for-each select="./*"> 
       <xsl:value-of select="local-name(.)" /> 
       <xsl:value-of select="$hyphenSeparator" /> 
       <xsl:value-of select="." disable-output-escaping="no"/> 
       <xsl:value-of select="$newline" /> 
      </xsl:for-each> 
      <xsl:value-of select="$newline" /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

出力

Changed Audit Items 1 
node1 - "file" 
node2 - "filename1" 
node3 - "filename1" 
target - "test2server" 
node5 - "lastnight" 

Changed Audit Items 2 
node1 - "registryval" 
node2 - "filename2" 
node3 - "filename2" 
target - "test4server" 
node5 - "morning" 
+0

Aniketありがとうございます。私はこれを試して、それがどうなるか見てみましょう。 –

関連する問題