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

Xslt 使用XSL检查多个节点中的多个属性值,xslt,xml-parsing,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 Min

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中。 让我知道做这件事的方法。我将尝试自己编写代码

编辑


当操作系统节点中的任何一个具有MajorVersion=x1和MinorVersion=x2时,我想复制机器节点。

如果属性不满足条件,则比较它们。。如果是,则丢弃它们

或者复制它们

在下面的代码中,第一个模板复制所有节点,
第二个模板删除的操作系统的主版本不等于“x1”,最小版本不等于“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>

就这么简单

<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文档时(提供的转换格式严重错误,没有用处!):


生成所需的正确结果:

<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>



如果我理解正确,仅当
majorVersion=minorversion
或是其他原因时,您才想复制操作系统节点?或者最好为上述输入XML编写输出XML。当任何一个操作系统节点的majorVersion=x1和minorversion=X2时,我想复制机器节点。如果这是您正在寻找的解决方案,请接受答案!这将完成QnA过程。@InfantProgrammer'Aravind':感谢您的帮助,但我犯了一个错误,没有按照Dimitre的解释提供好的XML。实际上,操作系统节点不应该被删除。我需要复制完整的机器节点。@RohitSrivastava,ya rohit现在检查一下,如果它按预期工作。。如果你还需要什么,请告诉我help@InfantProgrammer“Aravind”,我认为这个代码是不正确的——想想你是否应该使用
。“当涉及否定时,这是一个常见的错误。@DimitreNovatchev,我误解了这个问题.”。。正如我所想,用户只想复制匹配的节点,即majorversion=“x1”(其中x1是一个值!)和minorversion=“X2”。。所以我想出了这个密码!在阅读了你的答案后,我理解了这个要求。@InfantProgrammer'Aravind',这没关系,我们都在这里学习:)谢谢,这是一个快速的工作。似乎我需要更多地了解xsl。对于XML示例给您带来的不便,我深表歉意。我不明白OP希望由主机程序提供的值是params:)很高兴他得到了答案+1.
<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>
<?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>