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时,我想复制机器节点。
答案 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>