如果属性存在,请将其删除并将其值作为元素的值

时间:2017-02-13 23:45:38

标签: xslt xslt-1.0

我正在尝试删除特定属性并将其值作为由#包围的元素值。

不幸的是,我对XSLT的了解是如此基础,以至于我无法将任何类似的问题转化为我可以使用的东西。

无论我放在哪里

<xsl:template match="@Attr">
</xsl:template>

只删除属性。

简而言之,XML就像:

<Parent>
   <Elem1 Attr="Something" OtherAttr="Other">ExistingValue</Elem1>
   <Elem2 Attr="SomethingElse" />
</Parent>

应该成为:

<Parent>
   <Elem1 OtherAttr="Other">#Something#</Elem1>
   <Elem2>#SomethingElse#</Elem2>
</Parent>

如果元素已经有值,则应该替换它。除名为Attr之外的属性(如果存在)应保持不变。没有属性Attr的元素应保持不变。

3 个答案:

答案 0 :(得分:2)

  

如果元素已经有值,则应该替换它。

如果要修改元素,则必须对元素进行操作,而不是对属性进行操作。

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="*[@Attr]">
    <xsl:copy>
        <xsl:apply-templates select="@*[not(name()='Attr')]"/>
        <xsl:value-of select="concat('#', @Attr, '#')"/>
    </xsl:copy>
</xsl:template>


</xsl:stylesheet>

答案 1 :(得分:1)

使用此XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[@Attr]">
        <xsl:copy>
            <xsl:copy-of select="@* except @Attr"/>
            <xsl:value-of select="@Attr"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

自从我使用XSLT以来已经有一段时间了,但这样的事情应该有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
    <xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>
    <xsl:template match="/">
             <xsl:apply-templates select="*"/>
    </xsl:template>

<xsl:template match="*">
  <xsl:element name="{name()}">
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="*"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>