Почему XSLT не нравится мой запрос XPath? - PullRequest
1 голос
/ 02 ноября 2011

У меня есть запрос XPath, который пытается захватить родительский узел определенного файлового узла. Когда я использовал оценщик XPath в Xselerator, он был в порядке с моим запросом, но когда я помещал его в свой код XSLT, он мне подходил. Вот мой XSLT-код:

<xsl:template match="//*[local-name()='Wix']/*[local-name()='Fragment'][1]/*[local-name()='DirectoryRef']/*[local-name()='Directory'][./@*[local-name()='Name'][.='bin']]/*[local-name()='Component']/*[local-name()='File'][./@*[local-name()='Source'][.='!(wix.SourceDeployDir)\bin\Client.exe']]/..">
<xsl:copy>
  <xsl:apply-templates select="@* | node()" />
  <xsl:element name="RemoveFolder" namespace="{namespace-uri()}">
    <xsl:attribute name="Id">DeleteShortcutFolder</xsl:attribute>
    <xsl:attribute name="Directory">DesktopFolder</xsl:attribute>
    <xsl:attribute name="On">uninstall</xsl:attribute>
  </xsl:element>
</xsl:copy>

Есть идеи?

РЕДАКТИРОВАТЬ: Вот соответствующий XML (очищенный из файла большего размера):

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Directory Id="dirBD8892FBCC64DA5924D7F747259B8B87" Name="bin">
<Component Id="cmp92DC8F5323DA73C053179076052F92FF" Guid="{533500C1-ACB2-4A8D-866C-7CDB1DE75524}">
                    <File Id="fil7C1FC50442FC92D227AD1EDC1E6D259F" KeyPath="yes" Source="!(wix.SourceDeployDir)\bin\Client.exe">
                      <Shortcut Id="startmenuAdv" Directory="DesktopFolder" Advertise="yes" Name="!(wix.ProductName)" WorkingDirectory="INSTALLDIR" Icon="Icon.exe">
                        <Icon Id="Icon.exe" SourceFile="!(wix.SourceDeployDir)\Safeguard.SPI2.Client.exe" />
                      </Shortcut>
                      <netfx:NativeImage Id="ClientNativeImageId" Platform="64bit" Priority="0" AppBaseDirectory="INSTALLLOCATION" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" />
                    </File>
                </Component></Directory></DirectoryRef></Fragment></Wix>

Все, что я хочу сделать, это захватить узел Component. Visual Studio выдает мне следующую ошибку: в шаблоне вне предикатов допускаются только оси 'child' и 'attribute'. ... in \ Client.exe ']] / -> .. <- </p>

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Что ж, шаблон сопоставления XSLT не позволяет использовать все типы выражений XPath, вместо этого шаблоны являются подмножеством выражений XPath. Похоже, вы хотите получить доступ к родителю .., но вам не разрешено делать это в шаблоне XSLT, если он не находится внутри предиката. Таким образом, вам нужно будет переписать ваш шаблон, вместо foo[predicate]/.. используйте *[foo[predicate]].

[править] На основании вашего последнего комментария делает

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template xmlns:wi="http://schemas.microsoft.com/wix/2006/wi"
  match="wi:Component[wi:File[@Source[. = '!(wix.SourceDeployDir)\bin\Client.exe']]]">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <xsl:element name="RemoveFolder" namespace="{namespace-uri()}">
      <xsl:attribute name="Id">DeleteShortcutFolder</xsl:attribute>
      <xsl:attribute name="Directory">DesktopFolder</xsl:attribute>
      <xsl:attribute name="On">uninstall</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>

может быть достаточно (при условии, что вы хотите скопировать все, кроме компонента, куда вы добавляете элемент.

1 голос
/ 02 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...