diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index c8eeb77..92de697 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -374,8 +374,7 @@
     CXFA_Node* pProp = nullptr;
     if (XFA_Element::Subform == curNode->GetElementType() &&
         XFA_HASHCODE_Occur == uNameHash) {
-      CXFA_Node* pInstanceManager =
-          curNode->AsNode()->GetInstanceMgrOfSubform();
+      CXFA_Node* pInstanceManager = curNode->GetInstanceMgrOfSubform();
       if (pInstanceManager) {
         pProp = pInstanceManager->JSObject()->GetOrCreateProperty<CXFA_Occur>(
             0, XFA_Element::Occur);
@@ -383,10 +382,9 @@
     } else {
       XFA_Element eType = XFA_GetElementByName(wsName.AsStringView());
       if (eType == XFA_Element::PageSet) {
-        pProp = curNode->AsNode()->JSObject()->GetProperty<CXFA_Node>(0, eType);
+        pProp = curNode->JSObject()->GetProperty<CXFA_Node>(0, eType);
       } else if (eType != XFA_Element::Unknown) {
-        pProp = curNode->AsNode()->JSObject()->GetOrCreateProperty<CXFA_Node>(
-            0, eType);
+        pProp = curNode->JSObject()->GetOrCreateProperty<CXFA_Node>(0, eType);
       }
     }
     if (pProp) {
@@ -395,12 +393,11 @@
     }
   }
 
-  CXFA_Node* parentNode =
-      CXFA_NodeHelper::GetParent(curNode->AsNode(), XFA_LOGIC_NoTransparent);
+  CXFA_Node* parentNode = curNode->GetParent();
   uint32_t uCurClassHash = curNode->GetClassHashCode();
   if (!parentNode) {
     if (uCurClassHash == uNameHash) {
-      rnd.m_Objects.emplace_back(curNode->AsNode());
+      rnd.m_Objects.emplace_back(curNode);
       FilterCondition(wsCondition, &rnd);
       if (!rnd.m_Objects.empty())
         return true;
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index 167aa02..c9aba3d 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -151,6 +151,24 @@
                                 false));
 }
 
+CXFA_Node* GetTransparentParent(CXFA_Node* pNode) {
+  CXFA_Node* parent;
+  CXFA_Node* node = pNode;
+  while (true) {
+    parent = node ? node->GetParent() : nullptr;
+    if (!parent)
+      return nullptr;
+
+    XFA_Element parentType = parent->GetElementType();
+    if ((!parent->IsUnnamed() && parentType != XFA_Element::SubformSet) ||
+        parentType == XFA_Element::Variables) {
+      break;
+    }
+    node = parent;
+  }
+  return parent;
+}
+
 }  // namespace
 
 CXFA_NodeHelper::CXFA_NodeHelper() = default;
@@ -183,14 +201,12 @@
                                                      XFA_LOGIC_TYPE eLogicType,
                                                      bool bIsClassName) {
   std::vector<CXFA_Node*> siblings;
-  if (!pNode)
-    return siblings;
-  CXFA_Node* parent = GetParent(pNode, XFA_LOGIC_NoTransparent);
+  CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
   if (!parent)
     return siblings;
   if (!parent->HasProperty(pNode->GetElementType()) &&
       eLogicType == XFA_LOGIC_Transparent) {
-    parent = GetParent(pNode, XFA_LOGIC_Transparent);
+    parent = GetTransparentParent(pNode);
     if (!parent)
       return siblings;
   }
@@ -203,42 +219,16 @@
 }
 
 // static
-CXFA_Node* CXFA_NodeHelper::GetParent(CXFA_Node* pNode,
-                                      XFA_LOGIC_TYPE eLogicType) {
-  if (!pNode)
-    return nullptr;
-
-  if (eLogicType == XFA_LOGIC_NoTransparent)
-    return pNode->GetParent();
-
-  CXFA_Node* parent;
-  CXFA_Node* node = pNode;
-  while (true) {
-    parent = GetParent(node, XFA_LOGIC_NoTransparent);
-    if (!parent)
-      return nullptr;
-
-    XFA_Element parentType = parent->GetElementType();
-    if ((!parent->IsUnnamed() && parentType != XFA_Element::SubformSet) ||
-        parentType == XFA_Element::Variables) {
-      break;
-    }
-    node = parent;
-  }
-  return parent;
-}
-
-// static
 size_t CXFA_NodeHelper::GetIndex(CXFA_Node* pNode,
                                  XFA_LOGIC_TYPE eLogicType,
                                  bool bIsProperty,
                                  bool bIsClassIndex) {
-  CXFA_Node* parent = GetParent(pNode, XFA_LOGIC_NoTransparent);
+  CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
   if (!parent)
     return 0;
 
   if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
-    parent = GetParent(pNode, XFA_LOGIC_Transparent);
+    parent = GetTransparentParent(pNode);
     if (!parent)
       return 0;
   }
@@ -257,13 +247,13 @@
 // static
 WideString CXFA_NodeHelper::GetNameExpression(CXFA_Node* refNode) {
   WideString wsName = GetNameExpressionSinglePath(refNode);
-  CXFA_Node* parent = GetParent(refNode, XFA_LOGIC_NoTransparent);
+  CXFA_Node* parent = refNode ? refNode->GetParent() : nullptr;
   while (parent) {
     WideString wsParent = GetNameExpressionSinglePath(parent);
     wsParent += L".";
     wsParent += wsName;
     wsName = std::move(wsParent);
-    parent = GetParent(parent, XFA_LOGIC_NoTransparent);
+    parent = parent->GetParent();
   }
   return wsName;
 }
@@ -397,9 +387,6 @@
 
 // static
 bool CXFA_NodeHelper::NodeIsProperty(CXFA_Node* refNode) {
-  if (!refNode)
-    return false;
-
-  CXFA_Node* parent = GetParent(refNode, XFA_LOGIC_NoTransparent);
+  CXFA_Node* parent = refNode ? refNode->GetParent() : nullptr;
   return parent && parent->HasProperty(refNode->GetElementType());
 }
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.h b/xfa/fxfa/parser/cxfa_nodehelper.h
index c349d7e..c04178c 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.h
+++ b/xfa/fxfa/parser/cxfa_nodehelper.h
@@ -30,8 +30,6 @@
   static CXFA_Node* GetOneChildOfClass(CXFA_Node* parent,
                                        WideStringView wsClass);
 
-  static CXFA_Node* GetParent(CXFA_Node* pNode, XFA_LOGIC_TYPE eLogicType);
-
   static std::vector<CXFA_Node*> GetSiblings(CXFA_Node* pNode,
                                              XFA_LOGIC_TYPE eLogicType,
                                              bool bIsClassName);
