2015-04-12 4 views
0

Я пытаюсь использовать XSLT для обновления XML-файла (сгенерированного WiX). Я работаю почти отлично. Но я нашел внутреннюю ссылку, которую мне также нужно заменить, и это немного сложнее.XSLT - изменение атрибута (регулярное выражение?)

Вкратце, я добавляю _32x к значению Id в нескольких узлах XML. Но я нашел ссылку в XML в Id, которая также должна быть добавлена.

То есть, исходный XML-файл (значительно упрощен и с другими атрибутами удалены):

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="WEBINSTALLFOLDER"> 
     <Directory Id="dir1DB31186637C634CBA8E0643DF80869C"> 
     <Component Id="cmp65024F0DF585708F9ABEBE2F58FF64BA"> 
      <File Id="fil8C400D2459FD744947D08FD584B820E4" /> 
      <RegistryValue Value="ASP.dashboard_aspx" /> 
      <RegistryValue Value="App_Web_10b5qifx" /> 
      <RegistryValue Value="v4.0.30319" /> 
      <RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4]" /> 
     </Component> 
     </Directory> 
    </DirectoryRef> 
    </Fragment> 
</Wix> 

Мой XSLT добавляет _32x к значениям Id в компоненте и файлы корректно (и добавляет ссылку определений. wxi). Все это работает отлично, но я также должен изменить любой узел RegistryValue со значением «file: /// [# ...» с новым значением, которое заменяет «] 'на« _32x] ».

То есть, новый тег должен быть:

<RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4_32x]" /> 

Мой текущий XSLT является:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="wix:Wix"> 
    <xsl:copy> 
     <xsl:processing-instruction name="include">..\Definitions.wxi</xsl:processing-instruction> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
<!-- Identity transform. --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@Id[parent::wix:Component]"> 
    <xsl:attribute name="Id"> 
    <xsl:value-of select="." /> 
    <xsl:text>_32x</xsl:text> 
    </xsl:attribute> 
</xsl:template> 
<xsl:template match="@Id[parent::wix:File]"> 
    <xsl:attribute name="Id"> 
    <xsl:value-of select="." /> 
    <xsl:text>_32x</xsl:text> 
    </xsl:attribute> 
</xsl:template> 

И последний XML ПРЯМО СЕЙЧАС, без коррекции на RegistryValue является:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<?include ..\Definitions.wxi?> 
    <Fragment> 
    <DirectoryRef Id="WEBINSTALLFOLDER"> 
     <Directory Id="dir1DB31186637C634CBA8E0643DF80869C"> 
     <Component Id="cmp65024F0DF585708F9ABEBE2F58FF64BA_32x"> 
      <File Id="fil8C400D2459FD744947D08FD584B820E4_32x" /> 
      <RegistryValue Value="ASP.dashboard_aspx" /> 
      <RegistryValue Value="App_Web_10b5qifx" /> 
      <RegistryValue Value="v4.0.30319" /> 
      <RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4]" /> 
     </Component> 
     </Directory> 
    </DirectoryRef> 
    </Fragment> 
</Wix> 

Я довольно новичок в XSLT, поэтому не знаю, как выполнить замену на значение узла RegistryValue, когда в частности, файл: /// [# .. и выполните замену.

Это происходит снова и снова в моем XML-файле с разными фактическими идентификаторами файлов, поэтому простая жестко закодированная замена констант невозможна.

Спасибо

+0

Вы не упомянули ли вы в состоянии использовать XSLT 2.0, что делает этот вид вещи очень просто. –

ответ

0

Я должен также изменить любой RegistryValue узел со значением 'файла: /// [# ... с новое значение, которое заменяет ']' на '_32x]'.

Вы можете сделать это даже без регулярных выражений:

<xsl:template match="wix:RegistryValue/@Value[starts-with(., 'file:///[#')]"> 
    <xsl:attribute name="Value"> 
     <xsl:value-of select="substring-before(., ']')" /> 
     <xsl:text>_32x]</xsl:text> 
    </xsl:attribute> 
</xsl:template> 
0

бы добавить этот шаблон справки:

<xsl:template match="@Value[parent::wix:RegistryValue and matches(.,'^file:///\[#.*\]$')]"> 
    <xsl:attribute name="Value"> 
     <xsl:value-of select="concat(substring-before(.,']'), '_32x', ']')"/> 
    </xsl:attribute> 
</xsl:template> 
Смежные вопросы