【问题标题】:xslt: Add element/attribute in different node by reading value form otherxslt:通过读取其他节点的值在不同节点中添加元素/属性
【发布时间】:2017-11-08 07:39:43
【问题描述】:

我有以下 xml 文档

XML

<Wix>
  <Fragment>
    <DirectoryRef Id="TARGETDIR">
        <Component Id="JA" Name="MY_XYZ">
            <File/>
        </Component>
        <Component Id="ZH" Name="MY_ABC">
            <File/>
        </Component>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="COMPREF">
        <ComponentRef />
        <ComponentRef />
    </ComponentGroup>
  </Fragment>
</Wix>

在这里我想读取组件属性名称的值并使用该值来设置 ComponentRef 的属性。所以componentref应该是这样的

期望的输出

<ComponentRef SomeAttr="MY_XYZ"/>
<ComponentRef SomeAttr="MY_ABC"/>

如何使用 XSLT 实现这一点?

【问题讨论】:

  • ComponentRefComponent 之间的关系如何建立,仅通过位置(即第一个 Component 为第一个 ComponentRef 提供名称?
  • @MartinHonnen 我没明白你的意思,但是是的,每个组件都有其对应的组件引用,所以我想在单独的 Fragment 中创建 ComponentGroup,我可以为每个 @ 添加 ComponentRef 987654331@。我还编辑了问题,以明确我到底想要什么。请帮助我做了很多谷歌但找不到。
  • @MartinHonnen 在尝试了两个模板后给出了一些奇怪的结果。这可能是因为我正在从不同的节点级别读取。能否请您查看this 实际文件并让我知道问题所在?

标签: xslt wix heat


【解决方案1】:

根据您的其他需求,您可以剥离空间和应用模板以使用 position() 以使用 ComponentGroupComponentRef 子元素的索引来查找具有相同索引的 Component 子元素:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <xsl:template match="ComponentRef">
        <xsl:variable name="pos" select="position()"/>
        <ComponentRef SomeAttr="{/Wix/Fragment/DirectoryRef/Component[$pos]/@Name}"/>
    </xsl:template>

</xsl:transform>

或者你需要把第二个模板写成

    <xsl:template match="ComponentRef">
        <xsl:variable name="pos"><xsl:number/></xsl:variable>
        <ComponentRef SomeAttr="{/Wix/Fragment/DirectoryRef/Component[position() = $pos]/@Name}"/>
    </xsl:template>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多