На первый взгляд похоже, что это ваша проблема:
<xsl:apply-templates select="/cruisecontrol/build/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest'][@id=@testId]"/>
В частности, [@id=@testId]
часть. Вы пытаетесь найти UnitTest
на основе его атрибута id
из атрибута testid
для UnitTestResult
. Проблема в этом контексте [@id=@testId]
означает «искать элементы UnitTest, чьи атрибуты id и testId совпадают».
Что вам действительно нужно, так это использовать функцию current()
, которая позволяет вам иметь более одного контекста в фильтре, например:
[@id=current()/@testId]
Кроме того, как прокомментировал Лусеро, вы захотите удалить свои local-name()
вызовы, поскольку это упростит все:
<xsl:apply-templates
select="/cruisecontrol/build/TestRun/TestDefinitions/UnitTest[@id=current()/@testId]"
/>
В качестве альтернативы использованию длинных выражений XPath для поиска вы можете использовать keys . Они позволяют вам определить ключ, который вы можете использовать для более коротких поисков позже.
Определите ключ следующим образом:
<xsl:key
name="tests"
match="/cruisecontrol/build/TestRun/TestDefinitions/UnitTest"
use="@id"/>
Тогда используйте это так:
<xsl:apply-templates select="key('tests',@testId)"/>
Это избавляет вас от необходимости использовать функцию current (). В любом случае это будет работать.
Использование функции local-name()
может указывать на проблему с пространством имен. Если элементы build
и TestRun
находятся в разных пространствах имен, вы не можете просто запросить их, используя /cruisecontrol/build/TestRun/
. Это будет запрашивать элементы только из пространства имен по умолчанию. Если TestRun
находится в другом пространстве имен, вам нужно определить это пространство имен в файле XSLT и использовать его префикс в выражениях, например так: /cruisecontrol/build/ns:TestRun
, где ns
- рассматриваемый префикс пространства имен. local-name()
делает то, что он игнорирует часть пространства имен имени элемента, минуя правильное определение пространства имен. Это также полезно, когда вы не знаете, какие пространства имен будут использоваться в исходном документе.