任何人都可以帮我解决以下要求。 id属性值“123”将被分配给节点“cd11”中的属性ref =“123”。提前谢谢
<publisher>
<Name id="123">
<Location>Chicago</Location>
</Name>
<catalogue id="111" >
<cd11 id="222">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<year>1985</year>
</cd11>
</catalogue>
</publisher>
<publisher>
<Name id="123">
<Location>Chicago</Location>
</Name>
<catalogue id="111" >
<cd11 id="222" ref="123">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<year>1985</year>
</cd11>
</catalogue>
</publisher>
转换: 在节点“cd11”中创建一个新属性“ref”,属性@ Name / id将分配给@ cd11 / ref
答案 0 :(得分:1)
这是一种可能的方式:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalogue/cd11">
<xsl:copy>
<xsl:attribute name="ref">
<xsl:value-of select="parent::catalogue/preceding-sibling::Name/@id"/>
</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="@* | node()">...
:身份模板。此模板将应用它的所有节点和属性复制到输出XML,未更改。
<xsl:template match="catalogue/cd11">...
:此模板会覆盖<cd11>
元素的<catalogue>
元素的身份模板。此模板会复制匹配的cd11
元素,并创建新属性ref
,该值取自{&1;}之前的id
属性。 Name
元素。
答案 1 :(得分:1)
首先,我想通过@ Name / id和@ cd11 / ref,你的意思是属性&#34; id&#34;元素&#34;名称&#34;和属性&#34; ref&#34;元素&#34; cd11&#34;,分别是Name / @ id和cd11 / @ ref
尝试以下
- 为&#34; cd11&#34;创建一个模板。使用ref属性值的输入参数
- 为&#34;目录&#34;创建模板。元素,并在其中调用模板&#34; cd11&#34;传递ref属性的值,该属性是从兄弟元素&#34; name&#34;中提取的。
...像这样(可能需要在编译之前编辑)
<xsl:stylesheet >
<!-- ...-->
<xsl:template match="catalogue" >
<!-- any other processing of catalogue element -->
<xsl:element name="catalogue">
<xsl:attribute name="id" select="./@id"
<!-- call the cd11 template -->
<xsl:apply-templates select="./cd11">
<xsl:param name="pRef" select="../name[1]/@id"
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="cd11" >
<xsl:param name="pRef" />
<xsl:element name="cd11" >
<xsl:attribute name="id" select="./@id"/>
<xsl:attribute name="ref" select="$pRef"/>
<!-- copy the body of the element-->
<xsl:copy-of select= "./*"/>
</xsl:element>
</xsl:template>
<!-- ...-->
</xsl:stylesheet>
希望它成功。