Копировать и фильтровать XML на основе состояния и наличия дочерних узлов. - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над XSLT, который должен копировать весь XML, поддерживая ту же структуру и отфильтровывая некоторые узлы на основе условия.

в приведенном ниже примере мне нужно хранить только те узлы, где IsBusinness =Y и удалите узлы, в которых отсутствует тег IsBusiness.

<CompanyTypes>
  <Parent1>
    <ChildNode1>Test</ChildNode1>
    <ChildNode2>Test</ChildNode2>
    <CompanyType>
       <CompanyTypeID>1</CompanyTypeID>
       <CompanyTypeName>Individual</CompanyTypeName>
       <CompanyTypeDesc>Individual</CompanyTypeDesc>
        <IsBusiness>N</IsBusiness>
     </CompanyType>
  </Parent1>
  <Parent1>
    <ChildNode1>Test1</ChildNode1>
    <ChildNode2>Test</ChildNode2>
    <CompanyType>
       <CompanyTypeID>1</CompanyTypeID>
       <CompanyTypeName>Individual</CompanyTypeName>
       <CompanyTypeDesc>Individual</CompanyTypeDesc>
       <IsBusiness>Y</IsBusiness>
     </CompanyType>
  </Parent1>
  <Parent1>
    <ChildNode1>Test3</ChildNode1>
    <ChildNode2>Test9</ChildNode2>
    <CompanyType>
      <CompanyTypeID>1</CompanyTypeID>
      <CompanyTypeName>Individual</CompanyTypeName>
      <CompanyTypeDesc>Individual</CompanyTypeDesc>

    </CompanyType>
   </Parent1>
 </CompanyTypes>

желаемый вывод

<CompanyTypes>
<Parent1>
   <ChildNode1>Test1</ChildNode1>
   <ChildNode2>Test</ChildNode2>
   <CompanyType>
      <CompanyTypeID>1</CompanyTypeID>
      <CompanyTypeName>Individual</CompanyTypeName>
      <CompanyTypeDesc>Individual</CompanyTypeDesc>
      <IsBusiness>Y</IsBusiness>
   </CompanyType>
 </Parent1>

</CompanyTypes>

Я попробовал следующий код, но не смог удалить родительские теги, когда IsBusiness отсутствует.

<xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Parent1[CompanyType/IsBusiness != 'Y']"/>

1 Ответ

1 голос
/ 31 октября 2019

Что у вас есть:

<xsl:template match="Parent1[CompanyType/IsBusiness != 'Y']"/>

ищет элемент с именем IsBusiness, значение которого не "Y". Ваш 3-й Parent1 узел не имеет такого элемента, поэтому этот шаблон не соответствует ему.

Попробуйте вместо:

<xsl:template match="Parent1[not(CompanyType/IsBusiness = 'Y')]"/>
...