diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 719b74c..b5c7a78 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -760,15 +760,13 @@
 size_t CFXJSE_Engine::GetIndexByName(CXFA_Node* refNode) {
   if (!refNode)
     return 0;
-  return CXFA_NodeHelper::GetIndex(refNode, XFA_LOGIC_Transparent,
-                                   refNode->IsProperty(), false);
+  return CXFA_NodeHelper::GetIndex(refNode, refNode->IsProperty(), false);
 }
 
 size_t CFXJSE_Engine::GetIndexByClassName(CXFA_Node* refNode) {
   if (!refNode)
     return 0;
-  return CXFA_NodeHelper::GetIndex(refNode, XFA_LOGIC_Transparent,
-                                   refNode->IsProperty(), true);
+  return CXFA_NodeHelper::GetIndex(refNode, refNode->IsProperty(), true);
 }
 
 void CFXJSE_Engine::SetNodesOfRunScript(std::vector<CXFA_Node*>* pArray) {
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 1331d85..9829a2b 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -143,7 +143,7 @@
     nodes.push_back(pObject->AsNode());
 
   std::vector<CXFA_Node*> siblings =
-      CXFA_NodeHelper::GetSiblings(pChild, XFA_LOGIC_Transparent, bClassName);
+      CXFA_NodeHelper::GetSiblings(pChild, bClassName);
   nodes.insert(nodes.end(), siblings.begin(), siblings.end());
   rnd.m_Objects =
       std::vector<UnownedPtr<CXFA_Object>>(nodes.begin(), nodes.end());
@@ -334,7 +334,7 @@
         std::vector<CXFA_Node*> upArrayNodes;
         if (curNode->IsTransparent()) {
           upArrayNodes = CXFA_NodeHelper::GetSiblings(
-              ToNode(rnd.m_Objects.front().Get()), XFA_LOGIC_Transparent,
+              ToNode(rnd.m_Objects.front().Get()),
               !!(dwStyles & XFA_RESOLVENODE_TagName));
         }
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
@@ -466,7 +466,7 @@
     if (rnd.m_Objects.size() > nNum) {
       if (parentNode->IsTransparent()) {
         std::vector<CXFA_Node*> upArrayNodes = CXFA_NodeHelper::GetSiblings(
-            ToNode(rnd.m_Objects.front().Get()), XFA_LOGIC_Transparent,
+            ToNode(rnd.m_Objects.front().Get()),
             !!(dwStyles & XFA_RESOLVENODE_TagName));
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
           CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
@@ -656,8 +656,7 @@
     bool bIsClassIndex =
         curNode->IsUnnamed() ||
         (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet);
-    iCurIndex = CXFA_NodeHelper::GetIndex(curNode, XFA_LOGIC_Transparent,
-                                          bIsProperty, bIsClassIndex);
+    iCurIndex = CXFA_NodeHelper::GetIndex(curNode, bIsProperty, bIsClassIndex);
   }
 
   size_t iFoundCount = pRnd->m_Objects.size();
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index f750034..1e636bf 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -769,8 +769,7 @@
 
   return WideString::Format(
       pszFormat, ws.c_str(),
-      CXFA_NodeHelper::GetIndex(pNode, XFA_LOGIC_Transparent, bIsProperty,
-                                bIsClassIndex));
+      CXFA_NodeHelper::GetIndex(pNode, bIsProperty, bIsClassIndex));
 }
 
 }  // namespace
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index 978595d..9d76d54 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -23,7 +23,6 @@
 void TraverseSiblings(CXFA_Node* parent,
                       uint32_t dwNameHash,
                       std::vector<CXFA_Node*>* pSiblings,
-                      XFA_LOGIC_TYPE eLogicType,
                       bool bIsClassName,
                       bool bIsFindProperty) {
   ASSERT(parent);
@@ -46,8 +45,7 @@
       }
       if (child->IsUnnamed() &&
           child->GetElementType() == XFA_Element::PageSet) {
-        TraverseSiblings(child, dwNameHash, pSiblings, eLogicType, bIsClassName,
-                         false);
+        TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
       }
     }
     if (!pSiblings->empty())
@@ -65,13 +63,10 @@
       if (child->GetNameHash() == dwNameHash)
         pSiblings->push_back(child);
     }
-    if (eLogicType == XFA_LOGIC_NoTransparent)
-      continue;
 
     if (child->IsTransparent() &&
         child->GetElementType() != XFA_Element::PageSet) {
-      TraverseSiblings(child, dwNameHash, pSiblings, eLogicType, bIsClassName,
-                       false);
+      TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
     }
   }
 }
@@ -97,14 +92,12 @@
 
 // static
 std::vector<CXFA_Node*> CXFA_NodeHelper::GetSiblings(CXFA_Node* pNode,
-                                                     XFA_LOGIC_TYPE eLogicType,
                                                      bool bIsClassName) {
   std::vector<CXFA_Node*> siblings;
   CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
   if (!parent)
     return siblings;
-  if (!parent->HasProperty(pNode->GetElementType()) &&
-      eLogicType == XFA_LOGIC_Transparent) {
+  if (!parent->HasProperty(pNode->GetElementType())) {
     parent = GetTransparentParent(pNode);
     if (!parent)
       return siblings;
@@ -112,21 +105,19 @@
 
   uint32_t dwNameHash =
       bIsClassName ? pNode->GetClassHashCode() : pNode->GetNameHash();
-  TraverseSiblings(parent, dwNameHash, &siblings, eLogicType, bIsClassName,
-                   true);
+  TraverseSiblings(parent, dwNameHash, &siblings, bIsClassName, true);
   return siblings;
 }
 
 // static
 size_t CXFA_NodeHelper::GetIndex(CXFA_Node* pNode,
-                                 XFA_LOGIC_TYPE eLogicType,
                                  bool bIsProperty,
                                  bool bIsClassIndex) {
   CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
   if (!parent)
     return 0;
 
-  if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
+  if (!bIsProperty) {
     parent = GetTransparentParent(pNode);
     if (!parent)
       return 0;
@@ -134,8 +125,7 @@
   uint32_t dwHashName =
       bIsClassIndex ? pNode->GetClassHashCode() : pNode->GetNameHash();
   std::vector<CXFA_Node*> siblings;
-  TraverseSiblings(parent, dwHashName, &siblings, eLogicType, bIsClassIndex,
-                   true);
+  TraverseSiblings(parent, dwHashName, &siblings, bIsClassIndex, true);
   for (size_t i = 0; i < siblings.size(); ++i) {
     if (siblings[i] == pNode)
       return i;
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.h b/xfa/fxfa/parser/cxfa_nodehelper.h
index 6e0f280..fca64cf 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.h
+++ b/xfa/fxfa/parser/cxfa_nodehelper.h
@@ -16,21 +16,14 @@
 class CFXJSE_Engine;
 class CXFA_Node;
 
-enum XFA_LOGIC_TYPE {
-  XFA_LOGIC_NoTransparent,
-  XFA_LOGIC_Transparent,
-};
-
 class CXFA_NodeHelper {
  public:
   CXFA_NodeHelper();
   ~CXFA_NodeHelper();
 
   static std::vector<CXFA_Node*> GetSiblings(CXFA_Node* pNode,
-                                             XFA_LOGIC_TYPE eLogicType,
                                              bool bIsClassName);
   static size_t GetIndex(CXFA_Node* pNode,
-                         XFA_LOGIC_TYPE eLogicType,
                          bool bIsProperty,
                          bool bIsClassIndex);
 
