1

名前、ホスト、およびポートの属性を持つターゲット ホスト ノードで構成される xml ファイルがあります。

odnodes.xml:

<odnodes>
    <node>
        <name>malden_APP_OBC_DEV-1</name>
        <host>localhost</host>
        <port>20014</port>
        <comments></comments>
    </node>
    <node>
        <name>malden_APP_OBC_IT-2</name>
        <host>localhost</host>
        <port>20014</port>
        <comments></comments>
    </node>
    <node>
        <name>finish_IIS_OBC_UAT-1</name>
        <host>localhost</host>
        <port>20014</port>
        <comments></comments>
    </node>
    <node>
        <name>finish_IIS_OBC_PROD-2</name>
        <host>localhost</host>
        <port>20014</port>
        <comments></comments>
    </node>
</odnodes>

Perlを使用して、名前とノードの属性を持つノードを作成する別のファイルを動的に作成しています。ノードには同様のノードが設定されています。

グループ名の作成に使用される Perl:

my @names = split(/([_-])/, $groupnames);
my @names = @names[0];

print FILE "@names\n";

ノード属性の設定に使用される Perl:

foreach my $group (@groups) {
  my @nodes;
    foreach my $node (@nodenames) {
      chomp($group);
      chomp($node);
      if ($node =~ m/$group/) {
        push (@nodes, "$node,");
      }
    }
    chop @nodes[-1];
    my $groupxml = "\t<nodeGroup name=\"$group\" nodes=\"@nodes\"\/>\n";
    print ODSERVERFILE $groupxml;
}

グループノードの例:

<odConfiguration>
  <nodeSet>
    <nodeGroup name="malden" nodes="malden_APP_OBC_DEV-1,malden_APP_OBC_IT-2" />
    <nodeGroup name="finish" nodes="finish_IIS_OBC_UAT-1,finish_IIS_OBC_PROD-2" />
  </nodeSet>
</odConfiguration>

質問: XSL を使用してこれを達成するにはどうすればよいでしょうか? または、perl スクリプトを呼び出して実行し、結果を渡すことはできますか?

4

2 に答える 2

2

この XSLT 2.0 スタイルシートで実行できます。これは、Perl コードよりも短いことに注意してください。

<odConfiguration xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <nodeSet>
    <xsl:for-each-group select="//node/@name" group-by="substring-before(., '_')">
      <nodeGroup name="{current-grouping-key()}" 
                 nodes="{string-join(current-group(), ',')}" />
    </xsl:for-each-group>
  </nodeSet>
</odConfiguration>
于 2013-10-15T07:27:52.893 に答える
0

Muenchian メソッドを使用したグループ化

XSLT :

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

  <xsl:key name="k" match="node" use="substring-before(@name, '_')"/>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="node[generate-id() = generate-id(key('k', substring-before(@name, '_')))]">
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node">
    <nodeGroup name="{substring-before(@name, '_')}">
      <xsl:attribute name="nodes">
        <xsl:for-each select="key('k', substring-before(@name, '_'))">
          <xsl:value-of select="substring-after(@name, '_')"/>
          <xsl:if test="position() != last()">
            <xsl:text>,</xsl:text>
          </xsl:if>
        </xsl:for-each>
      </xsl:attribute>
    </nodeGroup>
  </xsl:template>
</xsl:stylesheet>

入力:

<root>
  <node name="malden_APP_OBC_DEV-1" host="localhost" port="20014" />
  <node name="malden_APP_OBC_IT-2" host="localhost" port="20014" />
  <node name="finish_IIS_OBC_UAT-1" host="localhost" port="20014" />
  <node name="finish_IIS_OBC_PROD-2" host="localhost" port="20014" />
</root>

出力:

<root>
  <nodeGroup name="malden" nodes="APP_OBC_DEV-1,APP_OBC_IT-2" />
  <nodeGroup name="finish" nodes="IIS_OBC_UAT-1,IIS_OBC_PROD-2" />
</root>
于 2013-10-14T22:46:15.887 に答える