2015-05-27 1 views
-1

У меня есть часть проверки бизнеса, которая должна произойти во время преобразования. Это связано с тем, что некоторая информация доступна только в то время.Как создать анализ xml-предков

Итак, я начал создавать XPath, который дал мне все узлы, которые мне нужны для анализа, который я достиг. Что-то вроде строк .//*[@attributeIdentifyingMyNodes]

То, с чем я борюсь, - это как перенести родовое дерево. Я знаю, что могу как-то погулять родителям; но меня беспокоит эффективность этого, так как это может происходить сотни раз за трансформацию.

Мне также нужно пройти всю родительскую ось узла и определить, и каждый узел, если что-то истинно, и если оно когда-либо ложно, то устраните эту ось. Я определить логическое значение, основанное на функции (и для практических целей необходимо вызвать эту функцию для оценки истинного или ложного)

  • Но фокус в том, у меня есть только ошибка, если каждый узел, идентифицированная в результате моего XPATH, в имеет родительскую ось, которая приводит к ложной оценке.

Я не против того, чтобы совершенно разных подходов, как оценка всех этих узлов, которые возвращают истинные в новое дерево переменной функции

trueFalseEvaluation заменяющего атрибут для иллюстративных целей

<?xml version="1.0" encoding="UTF-8"?> 
<root trueFalseEvaluation="true"> 
    <someNode trueFalseEvaluation="true"> 
     <someOtherNode trueFalseEvaluation="false"> 
      <myNodeIdentified1 identifyingAttribute="true"/> 
     </someOtherNode> 
    </someNode> 
    <someNode trueFalseEvaluation="false"> 
     <someOtherNode trueFalseEvaluation="false"> 
      <myNodeIdentified2 identifyingAttribute="true"/> 
     </someOtherNode> 
    </someNode> 
    <someNode trueFalseEvaluation="true"> 
     <someOtherNode trueFalseEvaluation="true"> 
      <myNodeIdentified3 identifyingAttribute="true"/> 
     </someOtherNode> 
    </someNode> 
    <someNode trueFalseEvaluation="true"> 
     <someOtherNode trueFalseEvaluation="true"> 
      <myNodeIdentified4 notIdentifying="true"/> 
     </someOtherNode> 
    </someNode> 
</root> 

Что я хочу от этого, это вернуть true, потому что myNodeIdentified3 имеет полную ось предка, которая оценивает значение true на каждом узле. Однако, если какой-либо из myNodeIdentified3's родителей был ложным, мой весь тест не удался.

И, наконец, мне нужно объединить это в нескольких документах XML (несколько наборов корня)

Спасибо за любую помощь здесь. Я действительно обеспокоен тем, что любое решение, которое я создаю, наполнит мой объем памяти или кратер производительности моего преобразования.

+2

Я мог понять только то, что вы хотите сделать. Но я серьезно думаю, что вы будете более конкретным из того, чего хотите достичь, разместив образец вывода и затем объяснив его, чтобы кто-то предложил какое-либо решение. –

+0

Ну, я действительно не хочу вывода. Я хочу проанализировать XML в процессе преобразования, чтобы он соответствовал нашим бизнес-правилам. Есть ли определенная деталь, которая нечеткая? – TheNorthWes

+0

Не получилось бы получить преобразованный вывод с некоторыми значениями, отображающими правильность XML в отношении ваших бизнес-правил? –

ответ

1

Ну, ясно, что тест вам нужно что-то вроде

test="every $x in ancestor::* satisfies $x/@trueFalseEvaluation='true'" 

или, если вы предпочитаете краткость над четкостью,

test="not(ancestor::*[not(@trueFalseEvaluation='true')])"/> 

Вы, кажется, обеспокоены выполнением этого. Чтобы убедиться, что эти проблемы реальны, вам необходимо указать требования к производительности, а затем измерять фактическую производительность.

Единственный способ сделать это, что приходит на ум, чтобы отфильтровать узлы во время рекурсивного спуска, т.е. рекурсии детей узла, только если @ trueFalseEvaluation = «истина»:

<xsl:if test="@trueFalseEvaluation='true'"> 
<xsl:apply-templates/> 
</xsl:if> 

: Ли это уместно в вашем случае, зависит от большей картины того, какую продукцию вы пытаетесь произвести, о чем вы нам не сказали.

+0

Спасибо, что помогли Майклу! Я совершенно новичок в этом, и я думаю, что это поможет мне. Я работаю с существующими преобразованиями и просто пытаюсь вставить больше проверок; поэтому процесс создания вывода сейчас не в моих руках. – TheNorthWes