2015-10-20 86 views
1

my last answered question串联的属性,我现在正在试图删除的两个属性,并使用他们的连接值创造一个新问题:XSLT:未知名

输入:

<A> 
<B> 
    <elemX att1="SN:" att2="toto1" att3="tata" SerialNumber="123X" /> 
    <elemY att1="SN:" att2="toto2" att3="tata" SerialNumber="123Y" /> 
</B> 
<B> 
    <elemX att1="tata1" att2="SN:" att3="toto" SerialNumber="456X" /> 
    <elemY att1="tata2" att2="SN:" att3="toto" SerialNumber="456Y" /> 
</B> 
<B> 
    <elemX att1="toto1" att2="tata" att3="SN:" SerialNumber="789X" /> 
    <elemY att1="toto" att2="tata2" att3="SN:" SerialNumber="789Y" /> 
</B> 

所需输出:

<A> 
<B> 
    <elemX SerialHarnessNumber="SN:"123X att2="toto1" att3="tata" /> 
    <elemY SerialHarnessNumber="SN:123Y" att2="toto2" att3="tata" /> 
</B> 
<B> 
    <elemX att1="tata1" SerialHarnessNumber="SN:456X" att3="toto" /> 
    <elemY att1="tata2" SerialHarnessNumber="SN:456Y" att3="toto" /> 
</B> 
<B> 
    <elemX att1="toto1" att2="tata" SerialHarnessNumber="SN:789X" /> 
    <elemY att1="toto" att2="tata2" SerialHarnessNumber="SN:789Y" /> 
</B> 

元素的顺序在这里并不重要。

要做到这一点,我用下面的XSL:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="@*[.='SN:']" > 
    <xsl:attribute name="SerialHarnessNumber"> 
     <xsl:value-of select="concat('SN:', @SerialNumber)" /> 
    </xsl:attribute> 
</xsl:template> 

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

就目前而言,我只设法显示 “SN:” 在的SerialNumber属性,但SerialHarnessNumber不与它连接,虽然我用@SerialNumber,这是一种先前在另一个XSLT上工作的语法。

我认为问题来自事实,即SN:值永远不在同一个元素中。

如何连接SerialNumber值与attX的值?

回答

1

差不多。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="@*[.='SN:']" > 
     <xsl:attribute name="SerialHarnessNumber"> 
      <xsl:value-of select="concat('SN:', ../@SerialNumber)" /> 
      <!-- _______________________________^^^    --> 
     </xsl:attribute> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

差不多,确实......它的工作原理,非常感谢你! :) –

0

使用../@SerialNumber来选择父元素的属性。

+0

与接受的答案相同的解决方案,但3分钟后...也谢谢你:) –

0

这难道不简单吗?

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="@SerialNumber"> 
    <xsl:attribute name="SerialHarnessNumber"> 
      <xsl:value-of select="concat('SN:', .)" /> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="@*[.='SN:']"/> 

</xsl:stylesheet> 
+0

这是另一种工作正常的方式,谢谢你分享!它对输出文件具有相同的效果,只是属性被排序。由于输出文件不应该被读取,所以订单并不重要,但我为了更多的项目保存您的解决方案;) –

+0

这些属性并非真正的“排序”。我只是认为修复已经具有重要价值的属性会更直接。结果,序列号保持其现有位置。 - 顺便说一句,XML规范明确指出属性的顺序没有意义。 –

+0

但是,如果您需要直接查看XML内容,则更加舒适,但这里不是这种情况。感谢您的解释 :) –