2012-11-27 73 views
2

xml如下所示。使用XSL檢查多個節點中的多個屬性值

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

我從一些源操作系統版本(說MajorVersion = x1和MinorVersion = X2)這個XML內,添加兩個XML programitically。 任務是比較操作系統的小操作系統版本和主版本操作系統,以及如果兩者都與源相同,則只需將機器節點複製到轉換後的xml。 讓我知道如何做到這一點。我會嘗試編碼自己。

編輯

我想複製設備的節點,當OS節點的任何一個具有MajorVersion = x1和MinorVersion = X2。

+0

如果我理解正確,你只想複製操作系統節點,只有在'major Version = minorversion'還是別的嗎? –

+0

或更好的爲上述輸入XML寫入輸出XML。 –

+0

我想複製機器節點,當任何一個OS節點有MajorVersion = x1和MinorVersion = x2時 –

回答

2

像這樣簡單 OS:

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

謝謝這是快速的工作。似乎我需要更多地進入xsl。對於XML示例的不便,我表示歉意。 –

+0

我不明白,OP期望值是由參數的主機程序提供.. :)很高興他得到了答案.. +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> 
+0

其實OS節點不應該被丟棄。我需要複製完整的機器節點。 –

+0

@RohitSrivastava,ya rohit現在檢查,如果它的工作正常,並讓我知道你是否需要任何幫助 –

+1

@ InfantProgrammer'Aravind',我認爲這段代碼是不正確的 - 考慮你是否應該使用'和'或'或'。當涉及否定時,這是一個常見的錯誤。 –

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>