使用XSL检查多个节点中的多个属性值

时间:2012-11-27 12:54:17

标签: xslt xml-parsing

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的次要版本和主要版本,如果它们两者仅与源相同,则将Machine节点复制到转换后的xml。 让我知道如何做到这一点。我会尝试自己编码。

修改

当任何一个OS节点具有MajorVersion = x1和MinorVersion = x2时,我想复制机器节点。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

答案 2 :(得分: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>