我有一个ASP.NET(VB)用户控件,我将要加载XML文档。此文档可能具有两个可能的根节点名称之一。我有3个可能的xsl文件需要通过.NET预先添加到xml文件中。添加xsl引用不是问题,但我遇到了确定要添加的WHICH xsl文件的问题。
在加载XML文档之后,我需要确定的第一件事是根节点。它可以是
<Document xmlns="urn:hl7-org:v3">
<templateId root="usetemplate_1" />
或
<Document xmlns="urn:hl7-org:v3">
<templateId root="usetemplate_2" />
或
<Record xmlns="urn:astm-org:REC">
<objectId>useobjectid</objectId>
注意前两个有一个命名空间,第三个有不同的命名空间(不知道如何在我的大脑中调和它)。
这些选项中的每一个都有一个不同的xsl文件要引用。在我可以重用的另一个地方,我有类似的代码,正如我所说,这只是确定要引用的正确文件的问题。到目前为止我已经有了这个:
Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode
m_xmld = New XmlDocument
m_xmld.Load(Me.XMLFileName)
Dim nsmgr As New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("x", "urn:hl7-org:v3")
m_nodelist = m_xmld.SelectNodes("x:Document/", nsmgr)
For Each m_node In m_nodelist
Next
我只是想知道在每个/下一行之间放什么来确定上面的选项中的哪一个,或者是否甚至是必要的,并且可以以不同的方式更有效地完成。
答案 0 :(得分:1)
这应该有效:
Dim m_xmld As New XmlDocument()
m_xmld.Load(Me.XMLFileName)
Dim nsmgr As New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("h", "urn:hl7-org:v3")
nsmgr.AddNamespace("a", "urn:astm-org:REC")
If m_xmld.SelectSingleNode("/h:Document/h:templateId[@root='usetemplate_1']", nsmgr) IsNot Nothing Then
' Use xsl A
ElseIf m_xmld.SelectSingleNode("/h:Document/h:templateId[@root='usetemplate_2']", nsmgr) IsNot Nothing Then
' Use xsl B
ElseIf m_xmld.SelectSingleNode("/a:Record/a:objectId", nsmgr) IsNot Nothing Then
' Use xsl C
End If
或者,如果Select Case
更有意义,您可以获取属性的值,如下所示:
Dim root As XmlNode = doc.SelectSingleNode("/h:Document/h:templateId/@root", nsmgr)
If root IsNot Nothing Then
Select Case root.InnerText
Case "usetemplate_1"
' Use xsl A
Case "usetemplate_2"
' Use xsl B
End Select
ElseIf doc.SelectSingleNode("/a:Record/a:objectId", nsmgr) IsNot Nothing Then
' Use xsl C
End If
您可以根据需要向命名空间管理器添加任意数量的命名空间。即使命名空间实际上没有在XML文档中的任何地方使用,这也不会成为问题。因此,正如您所看到的,您可以同时添加两个潜在的命名空间。