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)获取操作系统版本,并以编程方式添加这两个 xml。任务是比较 OS 和 olny 的次要和主要版本,如果它们都与源相同,然后将机器节点复制到转换后的 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

如果属性不满足条件,则比较属性..如果是,则删除它们..

或者复制它们

在下面的代码中,第一个模板复制所有节点,
第二个模板删除正在拥有的操作系​​统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 回答