xml - 为什么XSLT不喜欢我的XPath查询?

标签 xml xslt xpath

我有一个XPath查询,试图获取特定文件节点的父级。当我在Xselerator中使用XPath评估程序时,可以很好地进行查询,但是当我将其放入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给我以下错误:谓词外部的模式中仅允许“子”轴和“属性”轴。 ... in \ Client.exe']] /-> .. <-

最佳答案

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>


可能就足够了(假设您要复制除添加元素的Component之外的所有内容。

关于xml - 为什么XSLT不喜欢我的XPath查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7982985/

相关文章:

.net - 如何在 .NET 中使用 XSLT?

xml - 帮助选择带有xpath的节点

xml - xslt 异常 - 来自 <xsl :/> tag 的属性值

python - lxml 属性需要完整的命名空间

java - 使用 xalan 扩展在 XSL 中处理 java 集合

java - 如何在 XML XSLT 转换期间处理 (R) 符号

xml - 使用 xslt 创建具有公共(public)元素的元素列表

xml - 如何从 XSL 转换中获得独特的值?

java - tagoup 破坏了良好的 xml

java - 安卓 Java : How to let your app remember an answer