В XSLT 2.0 я бы написал так:
<xsl:template match="/">
<Body>
<Person>
<PhoneNumber/>
<Zip>
<xsl:variable name="index" as="xs:integer"
select="if (/source/dbSrc/srv/v[@name='name']='true') then 3 else 1"/>
<xsl:value-of select="/source/req[$index]/personal-info/address-info/zip-code"/>
</Zip>
</Person>
</Body>
</xsl:template>
С 1.0 переменная xsl: становится немного более сложной, но в остальном она такая же.
Обратите внимание на использование буквальных элементов результата и переменных для уменьшения размера кода; также избегание "/ text ()", что почти всегда является плохой практикой.
Здесь очень мало времени для использования шаблонных правил, потому что вы используете очень мало входных данных, и потому что вы, кажется, точно знаете, где их найти. Шаблонные правила вступают в свои права, если вы хотите быть менее жесткими, точно зная, где именно вы ищите источник: они помогают сделать код более устойчивым к изменчивости и изменению входных данных. Но, не видя источника и не зная дополнительных сведений, мы не можем сказать вам, где нужна эта гибкость. Жесткое кодирование индексов «1» и «3» кажется мне сигналом опасности, но только вы можете судить об этом.