2

我有一个 ASP.NET (VB) 用户控件,我将在其中加载一个 XML 文档。该文档可能具有两个可能的根节点名称之一。我有 3 个可能的 xsl 文件需要通过 .NET 在 xml 文件中添加。添加 xsl 引用不是问题,但我遇到了确定要添加哪个 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

我不知道在 for each/next 行之间放置什么来确定上面的选项中的哪一个,或者这是否是必要的并且可以通过不同的方式更有效地完成。

4

1 回答 1

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

或者,如果 aSelect 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 文档中的任何地方使用,这也不是问题。因此,如您所见,您可以同时添加两个潜在的命名空间。

于 2013-09-30T17:27:20.707 回答