43

ノードに文字列があり、文字列を「?」で分割したいのですが。配列の最後の項目を返します。

たとえば、次のブロックでは次のようになります。

<a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="someNode"/>
    </xsl:attribute>
    Link text
</a>

値を分割したいのですがsomeNode

編集:Asp.NetページのXslをロードするために使用するVB.Netは次のとおりです。

Dim xslDocPath As String = HttpContext.Current.Server.MapPath("~/App_Data/someXslt.xsl")
Dim myXsltSettings As New XsltSettings()
Dim myXMLResolver As New XmlUrlResolver()

myXsltSettings.EnableScript = True
myXsltSettings.EnableDocumentFunction = True

myXslDoc = New XslCompiledTransform(False)
myXslDoc.Load(xslDocPath, myXsltSettings, myXMLResolver)

Dim myStringBuilder As New StringBuilder()
Dim myXmlWriter As XmlWriter = Nothing

Dim myXmlWriterSettings As New XmlWriterSettings()
myXmlWriterSettings.ConformanceLevel = ConformanceLevel.Auto
myXmlWriterSettings.Indent = True
myXmlWriterSettings.OmitXmlDeclaration = True

myXmlWriter = XmlWriter.Create(myStringBuilder, myXmlWriterSettings)

myXslDoc.Transform(xmlDoc, argumentList, myXmlWriter)

Return myStringBuilder.ToString()

更新:特定のノードでXMLを分割する例を次に示します

4

8 に答える 8

51

再帰的な方法を使用します。

<xsl:template name="output-tokens">
    <xsl:param name="list" /> 
    <xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" /> 
    <xsl:variable name="first" select="substring-before($newlist, ' ')" /> 
    <xsl:variable name="remaining" select="substring-after($newlist, ' ')" /> 
    <id>
        <xsl:value-of select="$first" /> 
    </id>
    <xsl:if test="$remaining">
        <xsl:call-template name="output-tokens">
            <xsl:with-param name="list" select="$remaining" /> 
        </xsl:call-template>
    </xsl:if>
</xsl:template>
于 2008-09-26T18:04:00.030 に答える
12

XSLT 2.0以降を使用できる場合は、次を使用できますtokenize(string, separator)

tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")

w3schoolsXPath関数リファレンスを参照してください。

デフォルトでは、.NETはXSLT 3.0はもちろん、XSLT2.0もサポートしていません。.NETで既知の2.0以降のプロセッサは、IKVMを搭載したSaxon for .NETExselt、現在ベータ版の.NET XSLT 3.0プロセッサ、およびXMLPrimeXSLT2.0プロセッサのみです。

于 2008-09-25T22:14:35.080 に答える
8

私はsubstring-after()機能を使用することになった。これが私のために働いたものです:

<a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="substring-after(someNode, '?')"/>
    </xsl:attribute>
    Link text
</a>

XSLT のバージョンを 2.0 に設定した後でも、'tokenize()' is an unknown XSLT function.を使用しようとすると " " エラーが発生しましたtokenize()

于 2008-09-25T23:24:49.530 に答える
6

テンプレートエンジンがEXSLTをサポートしている場合、別の可能性を追加すると、そこからtokenize()を使用できます。

例えば:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:str="http://exslt.org/strings"
                extension-element-prefixes="str">

...
  <a>
    <xsl:attribute name="href">
      <xsl:text>/newpage.aspx?</xsl:text>
      <xsl:value-of select="str:tokenize(someNode)[2]"/>
    </xsl:attribute>              
  </a>
...
</xsl:stylesheet>
于 2010-05-19T16:06:49.070 に答える
3

残念ながら、.NET は XSLT 2.0 をサポートしていません。split()関数を持つ EXSLT をサポートしていることは確かです。Microsoft には、EXSLT の実装に関する 古いページがあります。

于 2008-09-26T18:44:02.743 に答える
2

string-beforeおよびstring-after関数を使用してテンプレートを作成し、それを全体で使用できます。これについてブログを書きました。

最後に、区切られた文字列をサブ文字列に分割するxsltテンプレートを思いつきました。私はそれが最も賢いスクリプトだとは言いませんが、確かに私の問題を解決します。

スタイルシート:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Paths/Item">
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="Path"/>
<xsl:with-param name="delimiter" select="Delimiter"/>
</xsl:call-template>
<br/>
</xsl:for-each>
</xsl:template>
<xsl:template name="SplitText">
<xsl:param name="inputString"/>
<xsl:param name="delimiter"/>
<xsl:choose>
<xsl:when test="contains($inputString, $delimiter)">
<xsl:value-of select="substring-before($inputString,$delimiter)"/>
<xsl:text disable-output-escaping = "no"> </xsl:text>
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="substring-after($inputString,$delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$inputString = ''">
<xsl:text></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$inputString"/>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

XMLファイル(変換される):

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="textSpliter.xslt"?>
<Paths>
  <Item>
    <Path>C:\ProgramFiles\SomeWierdSoftware</Path>
    <Delimiter>\</Delimiter>
  </Item>
</Paths> 
于 2011-05-28T08:18:16.187 に答える
1

念のために言っておきますが、1.0でこれを行っていて、本当に分割/トークンが必要な場合は、xslt拡張機能が必要です。

于 2008-09-26T08:04:59.233 に答える
1

XSLT 1.0 には分割関数自体はありませんが、substring-before 関数と substring-after 関数を使用して、目的を達成できる可能性があります。

または、Microsoft XSLT エンジンを使用している場合は、インライン C# を使用できます。

于 2008-09-25T22:18:09.627 に答える