2

xml は次のとおりです。

<MyXml>
<Machine1>
    <SupportedOS>
        <OS1 MajorVersion=1 MinorVersion=2/>
        <OS2 MajorVersion=2 MinorVersion=0/>
        <OS3 MajorVersion=1 MinorVersion=1/>
        <OS4 MajorVersion=2 MinorVersion=1/>
        <OS5 MajorVersion=3 MinorVersion=0/>
     </SupportedOS>
 </Machine1>
 </MyXml>

この XML 内のソース (MajorVersion=x1 と MinorVersion=x2 など) から OS バージョンを取得し、両方の xml をプログラムで追加します。タスクは、OS のマイナー バージョンとメジャー バージョンの両方を比較し、両方がソースと同じである場合にのみ、マシン ノードを変換された xml にコピーすることです。それを行う方法を教えてください。自分でコーディングしてみます。

編集

いずれかの OS ノードが MajorVersion=x1 および MinorVersion=x2 である場合に、マシン ノードをコピーしたいと考えています。

4

3 に答える 3

2

これと同じくらい簡単です:

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

 <xsl:param name="pMajor" select="1"/>
 <xsl:param name="pMinor" select="2"/>

 <xsl:template match="/*/*">
  <xsl:copy-of select=
   "self::*[*/*[@MajorVersion = $pMajor and @MinorVersion = $pMinor]]"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用された場合(提供されたものは非常に不正な形式であり、役に立ちません!):

<MyXml>
    <Machine1>
        <SupportedOS>
            <OS1 MajorVersion="1" MinorVersion="2"/>
            <OS2 MajorVersion="2" MinorVersion="0"/>
            <OS3 MajorVersion="1" MinorVersion="1"/>
            <OS4 MajorVersion="2" MinorVersion="1"/>
            <OS5 MajorVersion="3" MinorVersion="0"/>
        </SupportedOS>
    </Machine1>
    <Machine2>
        <SupportedOS>
            <OS1 MajorVersion="1" MinorVersion="3"/>
            <OS2 MajorVersion="2" MinorVersion="0"/>
            <OS3 MajorVersion="1" MinorVersion="1"/>
            <OS4 MajorVersion="2" MinorVersion="1"/>
            <OS5 MajorVersion="3" MinorVersion="0"/>
        </SupportedOS>
    </Machine2>
</MyXml>

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

<Machine1>
   <SupportedOS>
      <OS1 MajorVersion="1" MinorVersion="2"/>
      <OS2 MajorVersion="2" MinorVersion="0"/>
      <OS3 MajorVersion="1" MinorVersion="1"/>
      <OS4 MajorVersion="2" MinorVersion="1"/>
      <OS5 MajorVersion="3" MinorVersion="0"/>
   </SupportedOS>
</Machine1>
于 2012-11-27T13:51:15.937 に答える
1

条件を満たさない場合は属性を比較します..はいの場合はドロップします..

または、それらをコピーします

以下のコードでは、最初のテンプレートがすべてのノードをコピーし、
2 番目のテンプレートが OS を削除します。MajorVersion not equal to 'x1' and MinorVersion not equal to 'x2'

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

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  <xsl:template match="/MyXml/Machine1/SupportedOS/OS1[@MajorVersion != 'x1' and @MajorVersion!='x2']"/>
</xsl:stylesheet>
于 2012-11-27T12:58:23.180 に答える
0
<?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"/>
    <xsl:template match="/MyXml">
        <xsl:apply-templates select="//SupportedOS"/>
    </xsl:template>
    <xsl:template match="SupportedOS">
        <xsl:for-each select="child::*">
            <xsl:if test="@MajorVersion='1' and @MinorVersion='2'">
                <xsl:copy-of select="//Machine1"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
于 2012-11-30T14:25:56.780 に答える