문제

노드에 문자열이 있고 문자열을 ''켜고 싶습니까? ' 배열에서 마지막 항목을 반환합니다.

예를 들어 아래 블록에서 :

<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을 분할하는 예

도움이 되었습니까?

해결책

재귀 방법 사용 :

<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>

다른 팁

XSLT 2.0 이상을 사용할 수 있다면 사용할 수 있습니다. tokenize(string, separator):

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

참조 W3Schools xpath 함수 참조.

기본적으로 .NET은 XSLT 3.0은 물론 XSLT 2.0을 지원하지 않습니다. .NET에 유일하게 알려진 2.0+ 프로세서가 있습니다 .NET 용 색소폰 ~와 함께 IKVM, exselt, 현재 베타에있는 .NET XSLT 3.0 프로세서, XMLPRIME XSLT 2.0 프로세서.

나는 결국 그것을 사용했다 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().

템플릿 엔진이 지원되는 경우 또 다른 가능성을 추가합니다 exslt, 그러면 사용할 수 있습니다 토큰 화 () 그것을 통해서.

예를 들어:

<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>

.NET은 불행히도 XSLT 2.0을 지원하지 않습니다. 나는 그것이 exslt를 지원한다고 확신합니다. 나뉘다() 기능. Microsoft는 다음과 같습니다 오래된 페이지 Exslt의 구현.

사용하여 템플릿을 쓸 수 있습니다 string-before 그리고 string-after 기능을 수행하고 사용합니다. 나는 a 블로그 이에.

마지막으로 구분 된 문자열을 하위 문자로 분할하는 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> 

XSLT 1.0에는 분할 함수 자체가 없지만 기판 전 및 서브 스트링 기능 기능으로 수행하려는 작업을 달성 할 수 있습니다.

또는 Microsoft XSLT 엔진을 사용하는 경우 인라인 C#을 사용할 수 있습니다.

레코드를 위해서는 1.0 으로이 작업을 수행하고 실제로 분할/토큰 화이 필요하다면 XSLT 확장.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top