2

我有一个正在转换的输入 xml 文档,该文档在节点中包含以下内容:

 <misc-item>22 mm<br></br><fraction>7/8</fraction> in.</misc-item>

当我通过选择“misc-item”创建变量时,br 和 fraction 标签消失。但是,如果我使用“misc-item/br”创建一个变量并测试它是否找到了 br,那么测试似乎有效。

我想做的是使

 '<br></br>' 

进入空格或分号或其他东西,但我没有运气。我尝试获取“misc-item/br”的兄弟姐妹,但没有。我检查了“misc-item”的孩子数,它是一个。

非常感谢任何帮助。

我查看了被确定为可能是骗子的帖子。我试过这个无济于事:

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

<xsl:template match="br" mode='PageOutput'>
    <xsl:value-of select="' '" />
</xsl:template>

由于我没有像建议的欺骗那样忽略一个元素,而是进行替换,这似乎不太正确。

4

1 回答 1

3

当我通过选择“misc-item”创建变量时,br 和 fraction 标签消失。但是,如果我使用“misc-item/br”创建一个变量并测试它是否找到了 br,那么测试似乎有效。

创建变量时,您将在变量中存储对misc-item节点的引用。如果您要求value-of该节点,您将只得到文本,其中元素被剥离,但变量仍然包含节点本身。

这可能是您需要使用apply-templates而不是value-of. 一个共同的主题是拥有一个“身份模板”,它基本上按原样复制所有内容,但可以通过提供更具体的模板来覆盖某些节点的不同行为。

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

<!-- replace any br element with a semicolon -->
<xsl:template match="br">;</xsl:template>

您可以使用一种模式来限制这些模板仅在特定情况下使用

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

<!-- replace any br element with a semicolon -->
<xsl:template match="br" mode="strip-br">;</xsl:template>

现在你可以使用例如

<xsl:apply-templates select="$miscitem/node()" mode="strip-br" />

而不是<xsl:value-of select="$miscitem"/>得到你想要的结果。

于 2013-11-12T17:40:40.597 回答